5

我试图达到与每个线程相同的结果: Make some area of​​ bitmap transparent on touch。我坚持使用此答案中提供的代码:Lumis 答案并根据 SteD,此解决方案应该可以工作。

不幸的是对我不起作用(也对另一个用户:使触摸时位图的某些区域透明不起作用,它画了一个黑色圆圈),我只是得到黑色圆圈。我尝试了很多东西,但没有解决这个问题。根据第二个线程的建议使背景透明并没有任何区别。

经过多次实验,我发现透明度正在起作用,当我设置这个时

android:theme="@android:style/Theme.Translucent"

在我的 AndroidManifest.xml 中,我可以看到我的应用程序(即桌面)下的所有内容。我多次查看代码并看不到明显的错误,我认为的唯一原因是因为这是 Z 顺序,但位图和画布不维护 z 顺序。Z 排序是通过按特定顺序绘制来完成的(在此代码中是正确的)。

这是android代码优化的一些奇怪例子,还是我在android清单文件中遗漏了一些东西?

4

2 回答 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

这没有任何意义,除了 xfermode 确保覆盖位图是 bean 绘制的第二个(Z 顺序)并且透明度开始发挥作用。但是Z顺序应该通过绘图顺序来维护。

如果有人有更好的想法如何解决这个问题,请分享您的知识。

问候。

于 2012-05-04T04:48:45.973 回答
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);
    }

我试过了,它奏效了!希望这个解决方案可以帮助你

于 2013-09-09T07:10:29.730 回答