Honeycomb硬件加速似乎不适用于setColorFilter

时间:2012-03-26 23:31:22

标签: android drawing android-3.0-honeycomb hardware-acceleration

此代码使用位图的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并将其绘制到画布上,如右图所示:

enter image description here

但是,当打开硬件加速时,它在Honeycomb(Android 3.0)上不起作用。无论如何,它都会将形状描绘成黑色。它忽略了颜色值。但是,它可以在ICS(Android 4.0)上运行硬件加速。

我知道硬件加速不支持某些API,如Romain Guy documented here支持哪些绘图操作?,但我似乎没有使用任何提到的API不支持。

此外,听起来他说setColorFilter应该有效at this post

我的代码中是否存在Honeycomb不支持的内容?任何解决方法?在这种情况下,我希望保持硬件加速。

由于

2 个答案:

答案 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. :)