34

シンプルに動作するカスタム ビューを作成しようとしています。0 度から 360 度までのアーク パスで表示されるビットマップがあります。一部の FPS では度数が変化しています。

onDraw()そこで、メソッドをオーバーライドしてカスタム ビューを作成しました。

@Override
protected void onDraw(Canvas canvas) {

    canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
    arcPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC));
    canvas.drawArc(arcRectF, -90, currentAngleSweep, true, arcPaint);
    arcPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
    canvas.drawBitmap(bitmap, circleSourceRect, circleDestRect, arcPaint);
}

arcPaint次のように初期化されます。

arcPaint = new Paint();
arcPaint.setAntiAlias(true);
arcPaint.setColor(Color.RED); // Color doesn't matter

これで、すべてがうまく描画されますが、... ビュー全体で背景が黒くなっています。

設定canvas.drawColor(..., PorterDuff.Mode.DST)して省略するとcanvas.drawBitmap()、アークは透明な背景に適切に描画されます。

私の質問は、PorterDuffモードを設定して透明度を調整する方法です。

もちろんbitmap、アルファチャンネル付きの 32 ビット PNG です。

4

7 に答える 7

68

PorterDuff.Mode.CLEARハードウェア アクセラレーションでは動作しません。設定するだけ

view.setLayerType(View.LAYER_TYPE_SOFTWARE, null); 

私にとって完璧に機能します。

于 2017-06-17T18:14:49.290 に答える
2

ウィンドウが不透明であるため、黒い背景が表示されることを除いて、コードではすべて問題ありません。透明な結果を得るには、別のビットマップに描画する必要があります。onDraw メソッドで、新しいビットマップを作成し、その上ですべてのスタッフを実行してください。その後、このビットマップをキャンバスに描画します。

詳細とサンプル コードについては、この私の回答をお読みください。

于 2013-11-13T20:03:13.717 に答える
0

無地の背景がある場合は、[ペイント カラー] を背景色に設定するだけです。たとえば、白い背景がある場合は、次のことができます。

paint.setColor(Color.WHITE);

ただし、透明な背景で線を消去する必要がある場合は、これを試してください: 透明な色で描画するには、キャンバスにビットマップを設定した場合にのみ機能する Paint setXfermode を使用する必要があります。以下の手順に従うと、目的の結果が得られるはずです。

キャンバスを作成し、そのビットマップを設定します。

mCanvas = new Canvas();
mBitmap= Bitmap.createBitmap(scrw, scrh, Config.ARGB_8888);
mCanvas.setBitmap(mBitmap);
When you want to erase something you just need to use setXfermode.

public void onClickEraser() 
{ 
   if (isEraserOn)
      mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
   else
      mPaint.setXfermode(null);
}

これで、次を使用して透明色で描画できるはずです。

mCanvas.drawPath(path, mPaint);
于 2015-12-08T10:00:23.950 に答える