所以我在一天的大部分时间里都在为此苦苦挣扎。假设我有一个自定义 ImageView,我想覆盖在背景视图上(都在 RelativeLayout 内),当触摸它时,它会像 MS Paint 中的擦除工具一样擦除视图源位图的部分,从而暴露其下方的视图。我已经检查了几乎所有的线程(比如这个),他们建议在 Paint 对象中使用 PorterDuff SRC 模式,并从源位图的 ARGB_8888 阴影副本中创建一个 Canvas 以应用遮罩。
另外,我不能提前设置覆盖的来源,因为我必须通过网络下载它,以便 ImageView 的缩放类型为我处理缩放。
每次我覆盖 onDraw 时,当我在 IV 的位图上应用擦除时,它会显示黑色背景而不是它下面的视图,即使我将背景设置为透明。所以我在我的最后一根绳索上,为了揭示背景视图该做什么。
这是我到目前为止所拥有的:
查看构造函数:
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
paint.setColor(Color.TRANSPARENT);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeJoin(Paint.Join.ROUND);
paint.setStrokeWidth(STROKE_WIDTH);
paint.setAntiAlias(true);
覆盖 setImageBitmap 以从我重新配置的源位图设置我的画布:
public void setImageBitmap(Bitmap bitmap){
super.setImageBitmap(bitmap);
Drawable bd = getDrawable();
if(bd == null){
return;
}
Bitmap fullSizeBitmap = ((BitmapDrawable) bd).getBitmap();
overlay = fullSizeBitmap.copy(Config.ARGB_8888, true);
c2 = new Canvas(overlay);
}
onDraw 方法:
protected void onDraw(Canvas canvas) {
/*
* Override paint call by re-drawing the view's Bitmap first, then overlaying our path on top of it
*/
Drawable bd = getDrawable();
if(bd == null){
return;
}
Bitmap fullSizeBitmap = ((BitmapDrawable) bd).getBitmap();
if(fullSizeBitmap != null && c2 != null){
canvas.drawColor(Color.TRANSPARENT);
c2.drawBitmap(fullSizeBitmap, 0, 0, null);
c2.drawPath(path, paint);
canvas.drawBitmap(overlay, 0, 0, null);
}
}