在触摸时使位图的某些区域透明 - >再次

时间:2012-05-02 17:36:05

标签: android bitmap android-canvas transparency

我正在尝试获得与每个线程相同的结果: Make certain area of bitmap transparent on touch。 我坚持在这个答案中提供的代码:Lumis answer并根据SteD这个解决方案应该有效。

很遗憾不适合我(以及其他用户:Make certain area of bitmap transparent on touch doesn't works, it's draw a black circle),我只是变黑了。 我尝试了很多东西,但没有得到解决。根据第二个帖子的建议使背景透明,没有任何区别。

经过多次实验后,我发现透明度正常,当我设置此

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

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

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

2 个答案:

答案 0 :(得分: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确保覆盖位图是第二个(Z顺序)绘制的bean并且透明度开始发挥作用。但Z顺序应该通过绘制顺序来维护。

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

问候。

答案 1 :(得分: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);
    }

我尝试过它有效! 希望这个解决方案可以帮助你