だから私は一日の大部分の間これに苦労してきました。背景ビュー(両方ともRelativeLayout内)にオーバーレイするカスタムImageViewがあるとします。これをタッチすると、MSペイントの消去ツールのようにビューのソースビットマップの一部が消去され、その下のビューが表示されます。私はほとんどすべてのスレッド(このスレッドのように)をチェックしました。それらは、ペイントオブジェクトでPorterDuff SRCモードを使用し、ソースビットマップのARGB_8888シャドウコピーからキャンバスを作成してマスキングを適用することを提案しています。
また、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);
}
}