撰写两个着色器(拾色器)

时间:2013-06-21 06:09:25

标签: 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之后我应该再打开它吗?谁能解释一下?

1 个答案:

答案 0 :(得分:2)

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

硬件加速执行使用GPU在View画布上执行的所有绘图操作,这很好,因为它应该更快。但是当启用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" ...>

或每项活动

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

或您现在正在进行的每个视图。

请注意,Android中的存在错误已在4.1中修复(请参阅here),因此您的setLayerType(View.LAYER_TYPE_SOFTWARE, null)调用将被忽略Android版本(例如4.0.2)。

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