1

(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);
    }
}
4

1 に答える 1