我有一个名为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。
在动画期间,我看到我的黑色遮罩覆盖了圆形切口位图蒙版。
但是,在蒙版视图完成动画后,位图蒙版而不是保持透明,它会被渲染,所以我在蒙版视图中看到一个黑色圆形位图而不是圆孔。
有没有办法让位图蒙版保持位图蒙版,而不是渲染?
答案 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);
}
}
}
我在尝试完本教程后发现了解决方案:
希望它可以帮助他人。