在画布上绘图 - PorterDuff.Mode.CLEAR绘制黑色!为什么?

cad*_*vre 21 android drawing canvas porter-duff

我正在尝试创建一个简单的自定义视图:有一个由弧路径显示的位图 - 从0deg到360deg.学位正在随着一些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);
}
Run Code Online (Sandbox Code Playgroud)

arcPaint 初始化如下:

arcPaint = new Paint();
arcPaint.setAntiAlias(true);
arcPaint.setColor(Color.RED); // Color doesn't matter
Run Code Online (Sandbox Code Playgroud)

现在,一切都很棒,但是...整个视图中的背景是黑色的.

如果我设置canvas.drawColor(..., PorterDuff.Mode.DST)并省略canvas.drawBitmap()- 在透明背景上正确绘制圆弧.

我的问题是 - 如何设置PorterDuff模式以使其与透明度一起工作?

当然bitmap是具有alpha通道的32位PNG.

Nit*_*ani 32

PorterDuff.Mode.CLEAR不适用于硬件加速.刚设置

view.setLayerType(View.LAYER_TYPE_SOFTWARE, null); 
Run Code Online (Sandbox Code Playgroud)

适合我.

  • `setLayerType(LAYER_TYPE_HARDWARE, null);` 就我而言,此语句有效。但设置此后,线条和位图将被破坏。 (2认同)

小智 10

在视图初始化期间使用此语句

setLayerType(LAYER_TYPE_HARDWARE, null);
Run Code Online (Sandbox Code Playgroud)