我正在尝试创建一个自定义 View ,该 View 工作简单:存在一个通过弧形路径显示的位图-从0deg到360deg。学位随着一些FPS的变化而变化。

因此,我使用覆盖的onDraw()方法创建了一个自定义 View :

@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

现在,一切都很好,但是...背景在整个 View 中都是黑色的。

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

我的问题是-如何设置PorterDuff模式以使其具有透明性?

当然bitmap是带有alpha channel 的32位PNG。

最佳答案

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

view.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

非常适合我。

09-04 19:19