我正在尝试获得与每个线程相同的结果: 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清单文件中遗漏了什么?
答案 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);
}
我尝试过它有效! 希望这个解决方案可以帮助你