web-dev-qa-db-ja.com

Android透明度のあるキャンバスクリア

キャンバスから「消去」しようとしています。キャンバスをクリアする非常に簡単なテストと同じように、私は以下を実装しました。

_@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    canvas.drawColor(Color.argb(140, 0, 0, 0));
    canvas.drawColor(0, Mode.CLEAR);
}
_

Color.argb(140, 0, 0, 0)は、このビューが描画されるビューを淡色表示するように設定します。 drawColor(0, Mode.CLEAR)は、以前に適用された調光を削除するのではなく、画面を完全に黒くします。 アイデアはここから取られました

16
rperryng

以下を使用してください。

 canvas.drawColor(Color.TRANSPARENT,Mode.CLEAR);
22
Y0Gi

解決策は、描画するセカンダリキャンバスとビットマップを作成することでした。私のカスタムビューのonSizeChanged()メソッドは次のようになりました

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(w, h, oldw, oldh);

    bitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);
    bitmap.eraseColor(Color.TRANSPARENT);
    temp = new Canvas(bitmap);
}

onDrawMethodは次のようになります

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    temp.drawColor(Color.argb(80, 0, 0, 0));
    temp.drawCircle(centerPosX, centerPosY, 200, transparentPaint);
    canvas.drawBitmap(bitmap, 0, 0, null);
}

ここで、transparentPaintはインストラクターで次のように宣言されています

transparentPaint = new Paint();
transparentPaint.setColor(getResources().getColor(Android.R.color.transparent));
transparentPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
transparentPaint.setAntiAlias(true);
12
rperryng

ビュー全体を透明に設定する必要があります。そうしないと、透明色が黒になります。

上書きするビューのコンストラクターで、アルファをゼロに設定します。

setAlpha(0); // this is the secret.

次に、onDraw()メソッドで、ビューをクリアできます。

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    // ...
    canvas.drawColor(Color.TRANSPARENT,Mode.CLEAR);
    // do you painting here
}
0
Derzu