Android位图掩码清除不粘

时间:2016-02-20 06:47:07

标签: android mask

我有一个名为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();
    }
}

目前,我使用动画中的alpha淡入淡出了一个在我的蒙版中消失的Activity。

在动画期间,我看到我的黑色遮罩覆盖了圆形切口位图蒙版。

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

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

1 个答案:

答案 0 :(得分:0)

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

需要额外一行:

setLayerType(View.LAYER_TYPE_SOFTWARE, null);

我不知道将图层类型设置为软件的含义是什么,但在我的Galaxy Nexus上,视图可以通过动画渲染得很好。这里似乎没有任何糟糕的表现。

这是完整的代码:

公共类MaskView扩展了View {     私有上下文;     public Bitmap imageMask;     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

希望它可以帮助他人。