Android 位图遮罩清除不粘

Android bitmap mask clear doesn't stick

我有一个 class 叫 MaskView:

public class MaskView extends View
{
    private Context context;
    public Bitmap imageMask;
    public int maskXPos;
    public int maskYPos;

    private Paint maskPaint;

    public MaskView(Context context)
    {
        super(context);

        this.context = context;
        maskXPos = 0;
        maskYPos = 0;

        maskPaint = new Paint();
        maskPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));

        // 90% alpha
        this.setBackgroundColor(Color.argb(230, 0, 0, 0));
    }

    @Override public void onDraw(Canvas canvas)
    {
        super.onDraw(canvas);

        canvas.save();

        if(imageMask != null)
        {
            canvas.drawBitmap(imageMask, maskXPos, maskYPos, maskPaint);
        }

        canvas.restore();
    }
}

此刻,我得到了一个 Activity 使用 alpha 淡入淡出动画在我的蒙版中淡出的效果。

在动画播放过程中,我看到我的黑色遮罩与圆形镂空位图遮罩重叠。

但是,在蒙版视图完成动画后,位图蒙版不会保持透明,而是会被渲染,因此我在蒙版视图中看到的是黑色圆形位图而不是圆孔。

有没有办法让位图蒙版保持位图蒙版,而不进行渲染?

我找到了解决方案...几个小时后:D

需要额外一行:

setLayerType(View.LAYER_TYPE_SOFTWARE, null);

我不知道将图层类型设置为软件有什么影响,但在我的 Galaxy Nexus 上,视图可以很好地渲染动画。看来这里没有什么不好的表现。

完整代码如下:

public class MaskView 扩展视图 { 私有上下文上下文; public 位图图像遮罩; public int maskXPos; public int maskYPos;

private Paint maskPaint;

public MaskView(Context context)
{
    super(context);

    setClickable(true);

    this.context = context;
    maskXPos = 0;
    maskYPos = 0;

    maskPaint = new Paint();
    maskPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));

    // ------------------------------------------------------
    // This line is needed for the mask to work
    // ------------------------------------------------------
    setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}

@Override public void onDraw(Canvas canvas)
{
    super.onDraw(canvas);

    canvas.drawColor(Color.argb(230, 0, 0, 0));

    if(imageMask != null)
    {
        canvas.drawBitmap(imageMask, maskXPos, maskYPos, maskPaint);
    }
}

}

我在尝试本教程后发现了解决方案:

https://medium.com/@rgomez/android-how-to-draw-an-overlay-with-a-transparent-hole-471af6cf3953#.7uxgln7n4

希望对其他人有所帮助。