【发布时间】:2016-02-02 13:48:35
【问题描述】:
我有一个自定义视图,在onDraw() 中,我正在尝试执行位图遮罩。我有一个squareBitmap(红色)填充整个视图,我有一个circleBitmap(蓝色)作为遮罩。我正在使用模式:PorterDuff.Mode.DST_IN。
我期待的结果是一个红色的圆圈。我明白了,但我也得到了一个黑色的不透明背景。我不想要这个不透明的背景,而应该是透明的。 Figure 1 是我得到的结果,Figure 2 是我正在寻找的结果。
我的代码:(出于这个问题的目的,我已将 onDraw() 中的所有内容都移动了)
protected void onDraw(Canvas canvas) {
final int width = canvas.getWidth();
final int height = canvas.getHeight();
Bitmap circleBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas circleCanvas = new Canvas(circleBitmap);
Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);
p.setStyle(Paint.Style.FILL_AND_STROKE);
p.setColor(Color.BLUE);
circleCanvas.drawCircle(width / 2, height / 2, width / 2, p);
p.setColor(Color.RED);
Bitmap squareBitmap = Bitmap.createBitmap(canvas.getWidth(), canvas.getHeight(), Bitmap.Config.ARGB_8888);
Canvas squareCanvas = new Canvas(squareBitmap);
final Rect squareRect = new Rect(0, 0, width, height);
squareCanvas.drawRect(squareRect, p);
Paint q = new Paint(Paint.ANTI_ALIAS_FLAG);
canvas.drawBitmap(squareBitmap, 0, 0, q);
q.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
canvas.drawBitmap(circleBitmap, 0, 0, q);
q.setXfermode(null);
}
我哪里错了?如何避免这种黑色不透明背景?
【问题讨论】:
-
尝试
DST_OUT而不是DST_IN。或SRC_IN. -
@FrankN.Stein 不,它不起作用。现在我得到黑色实心圆圈和红色背景。背景是红色的,因为
squareBitmap,但是为什么圆圈是黑色的?理想情况下,圆圈应该是透明的,因此应该是蓝色(背景布局的颜色)。 -
你应该在这里找到答案:ssp.impulsetrain.com/porterduff.html
-
@FrankN.Stein 谢谢,但此链接提供了有关混合模式如何工作的想法,但没有解释解决我的问题的方法。我终于通过将硬件层设置到我的自定义视图来解决问题。
标签: android android-canvas android-view android-bitmap