(ViewGroup経由で)水平にスクロールできるビューを作成しました。左側には、行の画像 (タイトルのようなもの) があります。ビューを左にスクロールすると、項目が行のタイトルの下に移動します。タイトルの背景が透明になっているため、このタイトルの下にアイテムが表示されます。タイトルの下にある項目の一部を削除したい。タイトルを描画する前に、drawChild メソッド内で PorterDuff.Mode.CLEAR を使用して Paint を介して四角形を描画しようとしました。その結果、タイトルの下に黒い長方形ができました。同じ質問をいくつか見つけましたが、他のコンテキストでは:
https://code.google.com/p/android/issues/detail?id=54105#c1
Android Paint PorterDuff.Mode.CLEAR が私のビューに黒い色を描く
しかし、この問題の解決策は見つかりませんでした。私が理解しているように、PorterDuff.Mode.CLEAR を使用する前に、他のビットマップを描画する必要があります。私の場合、これはできません。ビューでいくつかの四角形を消去(私の場合は透明にする)できますか?
編集:
@Override
protected boolean drawChild(Canvas canvas, View child, long drawingTime) {
if(isTitle(child)){
Paint paint = new Paint();
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
Rect rect=new Rect(child.getLeft(),child.getTop(),child.getRight(),child.getBottom());
canvas.drawRect(rect,paint);
}
return super.drawChild(canvas, child, drawingTime);
}
また、このメソッドをどこかで見ましたが、レイアウトはまったく変更されませんでした:
@Override
protected boolean drawChild(Canvas canvas, View child, long drawingTime) {
if(isTitle(child)){
Paint paint = new Paint();
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
Bitmap b = Bitmap.createBitmap(child.getWidth(), child.getHeight(), Bitmap.Config.ARGB_8888);
canvas.drawBitmap(b, child.getLeft(),child.getTop(), paint);
b.recycle();
}
return super.drawChild(canvas, child, drawingTime);
}
編集2。saveLayer を試しました:
Paint paint = new Paint();
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
RectF rect=new RectF(child.getLeft(),child.getTop(),child.getRight(),child.getBottom());
int a = canvas.saveLayer(rect, paint, Canvas.ALL_SAVE_FLAG);
canvas.drawRect(rect,paint);
canvas.restoreToCount(a);
編集3
左、右、上下にスクロールできるビューがあります。このビューには、上部と左側に 2 種類のヘッダーが含まれており、サイズが異なる項目があります。このすべてのアイテムをビューに追加すると、最初にアイテムを追加してからヘッダーを追加します。この場合、ヘッダーは常にアイテムの前に描画されます。ユーザーが左/上にスクロールすると、アイテムは左/上に移動しますが、ヘッダーはその位置にとどまり、このアイテムはヘッダーの下になります。ヘッダーの背景があったときは問題ありませんでした。ヘッダーの下に項目が表示されなかったからです。しかし、今は背景がなく、ヘッダーの下に項目が表示されます。そのため、drawChild(すべてのアイテムを呼び出す)を使用して、ヘッダーの下にあるアイテムの一部を消去しようとしました。しかし、私が使用する場合
canvas.saveLayer(null, null, Canvas.ALL_SAVE_FLAG);
draw_whatever_you_want(canvas);
canvas.drawRect(rect, clearPaint);
canvas.restore();
すべてのアイテムに使用する必要があります。drawChild の私のコード
@Override
protected boolean drawChild(Canvas canvas, View child, long drawingTime) {
if(!isTitle(child)){
int left = child.getLeft();
int top = child.getTop();
int width = getLeftHeaderWidth();
int height = getTopHeaderHeight();
if(left < width) {
RectF rect = new RectF(0, 0, width, getHeight());
canvas.saveLayer(null, null, Canvas.ALL_SAVE_FLAG);
boolean result = super.drawChild(canvas, child, drawingTime);
canvas.drawRect(rect, mClearPaint);
canvas.restore();
return result;
} else if(top < height) {
RectF rect = new RectF(0, 0, getWidth(), height);
canvas.saveLayer(null, null, Canvas.ALL_SAVE_FLAG);
boolean result = super.drawChild(canvas, child, drawingTime);
canvas.drawRect(rect, mClearPaint);
canvas.restore();
return result;
} else{
return super.drawChild(canvas, child, drawingTime);
}
}else {
return super.drawChild(canvas, child, drawingTime);
}
}