java - 组成两个着色器(拾色器)

标签 java android shader android-canvas

在我的应用程序中,我使用了我的自定义颜色选择器小部件。在 onDraw 方法中,我使用以下代码混合两个 Shaders:

ComposeShader mShader = new ComposeShader(mValShader, mSatShader, PorterDuff.Mode.MULTIPLY);

然而,我得到的结果并不是我想要得到的。 下面你可以看到上面提到的 Shaders 是什么样子的:
enter image description here + enter image description here = enter image description here

如你所见,它完全不起作用......
结果应该是这样的(或多或少):
enter image description here

编辑(可能的解决方案):

为了让它工作,我必须使用以下代码:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
    setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}

但是我不太明白这行代码如何影响我的应用程序。我的意思是 IU 理解它设置了 HARDWARE ACCELERATION,这样做对我的应用程序有什么影响吗?绘制完 Shader 是否应该再次打开它?谁能解释一下?

最佳答案

这与默认启用硬件加速 (HA) 的 Android 4+ 有关。在 4.0 之前,您可以选择在 AndroidManifest.xml 中启用 HA。

硬件加速执行使用 GPU 在 View 的 Canvas 上执行的所有绘图操作,这很好,因为应该更快。但是,当启用 HA 时,某些绘图方法将不受支持。因此,要使用加速,您只能使用绘图方法的一个子集。

在你的情况下,问题是,正如文档所说(参见 Unsupported Drawing Operations )

ComposeShader can only contain shaders of different types (a BitmapShader and a  
LinearGradient for instance, but not two instances of BitmapShader)



禁用硬件加速。

您可以在 AndroidManifest.xml 中为整个应用程序禁用 HA

<application android:hardwareAccelerated="false" ...>

或每个 Activity

<application android:hardwareAccelerated="true">
<activity ... />
<activity android:hardwareAccelerated="false" />
</application>

或像您现在所做的那样按 View 。

请记住,Android 中有一个错误已在 4.1 中修复(参见 here),因此您的 setLayerType(View.LAYER_TYPE_SOFTWARE, null) 调用在某些 Android 版本(例如 4.0.2)中将被忽略。

如果为 View 禁用 HA,则不必再次启用它,因为 HA 仅影响 View 的绘制。

关于java - 组成两个着色器(拾色器),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17228717/

相关文章:

java - Random() 不生成随机数

ios - OpenGL 批处理和实例唯一性

java - 如何将字符串转换为编码格式

android - 如何同时播放/流式传输视频并将其保存到应用程序缓存?

java - 当子字符串包含某些字符时更改整个字符串

java - Google Ima SDK,播放声音但没有 View

opengl - 为什么此Phong着色器起作用?

html - WebGL 和 HTML 着色器类型

java - 将 "X"移动到不同的位置

java - 将字符串格式化为十六进制值并将其附加到字符数组中