0

だから私は一日の大部分の間これに苦労してきました。背景ビュー(両方とも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);
    }
}
4

2 に答える 2

1

これは本当に古い質問であることは知っていますが、これが私が抱えていた同様の問題を解決するためにしたことです。多分それは将来誰かを助けるでしょう。

ImageViewAPI レベル 11 以降では、黒い領域ではなく背面の画像を公開するために、このコードを指定する必要があります。

if (Build.VERSION.SDK_INT >= 11) {
    imageview.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}

これにより、背面の画像が正常に表示されました

于 2013-02-26T11:01:44.517 に答える