此代码使用位图的Alpha通道绘制单一颜色(带alpha)。
Bitmap alphaMask = bitmap.extractAlpha();
Paint paint = new Paint();
int color = Color.GRAY;
...
paint.setColor(color);
paint.setColorFilter(new PorterDuffColorFilter(color, PorterDuff.Mode.DST_IN));
...
canvas.drawBitmap(alphaMask, x, y, paint);
例如,它将采用左侧的Bitmap并将其绘制到画布上,如右图所示:
但是,当打开硬件加速时,它在Honeycomb(Android 3.0)上不起作用。无论如何,它都会将形状描绘成黑色。它忽略了颜色值。但是,它可以在ICS(Android 4.0)上运行硬件加速。
我知道硬件加速不支持某些API,如Romain Guy documented here,支持哪些绘图操作?,但我似乎没有使用任何提到的API不支持。
此外,听起来他说setColorFilter应该有效at this post。
我的代码中是否存在Honeycomb不支持的内容?任何解决方法?在这种情况下,我希望保持硬件加速。
由于
答案 0 :(得分:6)
Android 3.0如何处理alpha8位图有一个错误。我非常抱歉,因为这完全是我的错。但是,此问题已在Android 4.0中修复。
有两种可能的解决方法: - 在视图上设置软件图层类型 - 或者创建自己的Bitmap并在其中呈现您需要的内容。然后,您可以在硬件加速的Canvas上绘制此位图。
答案 1 :(得分:4)
我相信这里最好的答案是来自罗曼盖伊。 Quoth he:
但是,你所描述的应该可以正常工作。所有渐变 支持,以及所有混合模式。请报告错误 对于您遇到的任何问题都可以重现的测试用例,我会得到它们 固定的。
鉴于此声明,您遇到的行为是一个错误。这是contacting the primary developer responsible实际上是可以提供的最佳技术修复的情况之一。
他确实发布了一个解决方法:
我当前检查了实现和硬件渲染器 仅支持ComposeShader中不同类型的着色器。这个 意味着您可以使用渐变+位图,但不能使用两个位图或两个位图 梯度。请注意,对于执行不支持的事物的视图 您可以使用
setLayerType(LAYER_TYPE_SOFTWARE, null)
强制硬件 它们用软件渲染。
也许他会在这里发帖以进一步启发我们所有人。 He did. :)