我正在玩位图蒙版,在尝试使用Paint绘制ALPHA_8
位图蒙版时偶尔会发现一个有趣的问题。PorterDuff.Mode.DST_IN
它只是不起作用,至少在 Android 6.x 和 5.x 上是这样。
这是我的示例可绘制代码:
public class MaskedDrawablePorterDuffDstIn extends Drawable {
private Bitmap mPictureBitmap;
private Bitmap mMaskBitmap;
private Bitmap mBufferBitmap;
private Canvas mBufferCanvas;
private final Paint mPaintDstIn = new Paint();
public MaskedDrawablePorterDuffDstIn() {
mPaintDstIn.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
}
@Override
public void draw(Canvas canvas) {
if (mPictureBitmap == null || mMaskBitmap == null) {
return;
}
mBufferCanvas.drawBitmap(mPictureBitmap, 0, 0, null);
mBufferCanvas.drawBitmap(mMaskBitmap, 0, 0, mPaintDstIn);
canvas.drawBitmap(mBufferBitmap, 0, 0, null);
}
@Override
protected void onBoundsChange(Rect bounds) {
super.onBoundsChange(bounds);
final int width = bounds.width();
final int height = bounds.height();
if (width <= 0 || height <= 0) {
return;
}
mBufferBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
mBufferCanvas = new Canvas(mBufferBitmap);
}
...
当mMaskBitmap
有ARGB_8888
配置它工作得很好。但是当我使用ALPHA_8
它时不会。在这种情况下,图片根本没有被掩盖。
这是我在 Activity 中加载资源的方式:
private void loadImages() {
mPictureBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.picture);
mMaskBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.mask_circle).extractAlpha();
}
请注意.extractAlpha()
哪个给了我ALPHA_8
位图。
以下是我使用 Drawable 的方法:
public void setDrawablePDDstIn(View view) {
MaskedDrawablePorterDuffDstIn maskedDrawable = new MaskedDrawablePorterDuffDstIn();
maskedDrawable.setPictureBitmap(mPictureBitmap);
maskedDrawable.setMaskBitmap(mMaskBitmap);
mImageView.setImageDrawable(maskedDrawable);
}
更有趣的是,当我尝试另一种方法时,先绘制蒙版,然后使用SRC_IN
Paint 绘制图片 - 它再次正常工作,即使使用ALPHA_8
蒙版:
public class MaskedDrawablePorterDuffSrcIn extends Drawable {
private Bitmap mPictureBitmap;
private Bitmap mMaskBitmap;
private Bitmap mBufferBitmap;
private Canvas mBufferCanvas;
private final Paint mPaintSrcIn = new Paint();
public MaskedDrawablePorterDuffSrcIn() {
mPaintSrcIn.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
}
@Override
public void draw(Canvas canvas) {
if (mPictureBitmap == null || mMaskBitmap == null) {
return;
}
mBufferCanvas.drawBitmap(mMaskBitmap, 0, 0, null);
mBufferCanvas.drawBitmap(mPictureBitmap, 0, 0, mPaintSrcIn);
//dump the buffer
canvas.drawBitmap(mBufferBitmap, 0, 0, null);
}
...
这是我在GitHub 上试验的整个项目的链接。它包含非工作和工作解决方案,请随意使用。
任何人都知道为什么组合DST_IN
和ALPHA_8
不按预期工作?