画布上的Android Mask位图生成黑色空间

use*_*347 8 android mask bitmap

我有一个掩码位图,一半是红色,一个是透明的,如 https://www.dropbox.com/s/931ixef6myzusi0/s_2.png

我想使用掩码位图在画布上绘制只在红色区域可见的内容,代码如下:

Paint paint = new Paint();


public void draw(Canvas canvas) {
// draw content here
  ...

//and mask bitmap here
  paint.setXfermode(new PorterDuffXfermode(android.graphics.PorterDuff.Mode.DST_IN));
  canvas.drawBitmap(maskBitmap, 0, 0, paint);

}
Run Code Online (Sandbox Code Playgroud)

结果如我所料(内容仅在红色区域可见,但透明区域成为黑色是问题!)

此图像结果:https://www.dropbox.com/s/mqj48992wllfkiq/s_2%20copy.png 任何人帮助我???

Ser*_*kar 37

这是一个帮助我实现屏蔽的解决方案:

public void draw(Canvas canvas) {
        Bitmap original = BitmapFactory.decodeResource(getContext().getResources(),R.drawable.original_image);
        Bitmap mask = BitmapFactory.decodeResource(getContext().getResources(),R.drawable.mask_image);

        //You can change original image here and draw anything you want to be masked on it.

        Bitmap result = Bitmap.createBitmap(mask.getWidth(), mask.getHeight(), Config.ARGB_8888);
        Canvas tempCanvas = new Canvas(result);
        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));
        tempCanvas.drawBitmap(original, 0, 0, null);
        tempCanvas.drawBitmap(mask, 0, 0, paint);
        paint.setXfermode(null);

        //Draw result after performing masking
        canvas.drawBitmap(result, 0, 0, new Paint());
}
Run Code Online (Sandbox Code Playgroud)

面具应该是具有透明度的白色图像.
它会像这样工作:
原始图像 + 面具 = 结果图像

  • 但在 onDraw() 中创建位图可能会导致内存不足异常 (2认同)

Hen*_*nry 6

我在自定义视图中遇到了同样的问题,而不是从资源中解码位图,我通过canvas.draw*()方法从头开始创建原始位图和掩码位图(因为原始和掩码都是基本形状).我得到的blank opaque space不是transparent一个.我通过在我的视图中设置硬件层来修复它.

View.setLayerType(LAYER_TYPE_HARDWARE, paint);
Run Code Online (Sandbox Code Playgroud)

有关为何要在此处执行此操作的详细信息:https://stackoverflow.com/a/33483016/4747587