在触摸时使位图的某个区域透明

5
我正在尝试实现与以下帖子相同的结果: 在触摸时使位图的某些区域透明。 我坚持使用此答案中提供的代码:Lumis answer,据SteD称,此解决方案应该有效。
不幸的是,对我来说(还有另一位用户:使位图的某些区域透明没有起作用,它会绘制一个黑色圆圈),这并没有起作用,我只得到了黑色圆圈。 我尝试了许多方法,但都没有解决问题。根据第二个帖子的建议,使背景透明并没有任何区别。
经过多次实验,我发现当我设置以下内容时,透明度有效:
android:theme="@android:style/Theme.Translucent"

在我的AndroidManifest.xml文件中,我可以看到所有应用程序即桌面下的内容。

我已经多次查看代码,没有发现明显的错误,唯一可能是Z顺序的问题,但位图和画布不能维护Z顺序。Z排序是通过以特定顺序绘制完成的(在这段代码中是正确的)。

这是Android代码优化的奇怪示例,还是我在Android清单文件中遗漏了什么?

2个回答

6

最终我找到了可行的解决方案:

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

    //draw background
    canvas.drawBitmap(bgr, 0, 150, null);
    //copy the default overlay into temporary overlay and punch a hole in it                          
    c2.drawBitmap(overlayDefault, 0, 0, null); //exclude this line to show all as you draw
    c2.drawCircle(X, Y, 80, pTouch);
    //draw the overlay over the background
    //canvas.drawBitmap(overlay, 0, 0, null);

    Paint new_paint = new Paint(/*Paint.ANTI_ALIAS_FLAG*/);
    new_paint.setXfermode(new PorterDuffXfermode(Mode.SRC_ATOP));
    canvas.drawBitmap(overlay, 0, 0, new_paint);
}

但我不明白为什么能够正常工作。我正在使用此源代码调查xfermodes:android Xfermodes demo,并根据以下图像:Xfermodes image

除了确保覆盖位图被第二次绘制(Z顺序)和透明度发挥作用之外,它没有任何意义。但是Z顺序应由绘制顺序维护。

如果有人有更好的解决方案,请分享你的知识。

问候。


新建画笔 new_paint = new Paint(/Paint.ANTI_ALIAS_FLAG/); new_paint.setXfermode(new PorterDuffXfermode(Mode.SRC_ATOP)); canvas.drawBitmap(overlay, 0, 0, new_paint);这是解决问题的主要方法,谢谢。 - usr30911

2

您可以编辑onDraw()方法:

public void onDraw(Canvas canvas){
        super.onDraw(canvas);
        canvas.drawColor(Color.TRANSPARENT);
        canvas.drawBitmap(bgr, 0, 0, null);

        c2.drawCircle(X, Y, 10, pTouch);
        Paint new_paint = new Paint(/*Paint.ANTI_ALIAS_FLAG*/);
        new_paint.setXfermode(new PorterDuffXfermode(Mode.SRC_ATOP));
        canvas.drawBitmap(overlay, 0, 0, new_paint);
    }

我尝试了一下,它有效了!希望这个解决方案能帮到你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接