【问题标题】:Honeycomb Hardware Acceleration doesn't seem to work with setColorFilter蜂窝硬件加速似乎不适用于 setColorFilter
【发布时间】:2012-03-26 23:31:22
【问题描述】:

此代码使用位图的 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 不支持的内容?任何解决方法?在这种情况下,我希望保持硬件加速。

谢谢

【问题讨论】:

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


    【解决方案1】:

    Android 3.0 处理 alpha8 位图的方式存在错误。我对此感到非常抱歉,因为这完全是我的错。然而,这个问题在 Android 4.0 中得到了修复。

    有两种可能的解决方法: - 在您的视图上设置软件层类型 - 或创建您自己的位图并在其中渲染您需要的内容。然后,您可以在硬件加速的 Canvas 上绘制此位图。

    【讨论】:

    • +1。很不错。感谢您光临并告知我们! :)
    • 嘿,别担心,你们用 Android 做了很多了不起的事情,不用道歉!无论如何,我最终还是按照您所说的将绘图绘制成位图,然后将位图绘制到硬件加速画布上。为我工作!谢谢
    • @littleFluffyKitty 我很高兴一切顺利。谢谢,@RomainGuy!
    【解决方案2】:

    我相信最好的答案将来自 Romain Guy。 Quoth he:

    但是,您所描述的应该可以正常工作。所有渐变 支持,以及所有混合模式。请报告错误 您遇到的任何问题的可重现测试用例,我会得到它们 固定。

    鉴于此声明,您遇到的行为是一个错误。这是contacting the primary developer responsible 实际上是可以提供的最佳技术修复的情况之一。

    不过,他确实发布了解决方法:

    我检查了当前的实现和硬件渲染器 仅支持 ComposeShader 中不同类型的着色器。这 意味着您可以使用渐变+位图,但不能使用两个位图或两个 渐变。请注意,对于执行不支持的事情的视图 你可以使用setLayerType(LAYER_TYPE_SOFTWARE, null)强制的硬件 他们在软件中渲染。

    也许他会在这里发帖进一步启发我们大家。 He did. :)

    【讨论】:

    • 感谢您的信息。我尝试设置 view.setLayerType(LAYER_TYPE_SOFTWARE, null) 但 onDraw() 接收的画布仍然是硬件加速的(canvas.isHardwareAccelerated),并且代码仍然产生不正确的结果。似乎画布本身不能进行硬件加速。
    • 有人知道是否有办法让画布被软件渲染?
    • 将图层类型设置为软件。如果您获得的是硬件 Canvas,则可能将图层设置在错误的视图上。
    • 我在构造函数期间设置了view.setLayerType(LAYER_TYPE_SOFTWARE, null),并在onDraw() 期间验证它记录getLayerType()。每次记录它的值都是 1 (LAYER_TYPE_SOFTWARE)。即便如此,Canvas 也是GLES20RecordingCanvas 的一个实例。我能够使用您在回答中提到的位图路线解决此问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-23
    • 2022-12-03
    • 2014-04-22
    • 2023-03-19
    • 2020-04-04
    相关资源
    最近更新 更多