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);
}
}
}
我在尝试本教程后发现了解决方案:
希望对其他人有所帮助。
我有一个 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);
}
}
}
我在尝试本教程后发现了解决方案:
希望对其他人有所帮助。