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);
}
  • Issue with ComposeShader on Android 4.1.1

  • 但是我真的不明白这行代码如何影响我的应用程序。我的意思是 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>
    

    或按您现在所做的查看。

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

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

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

    相关文章:

    c++ - 直通几何着色器

    ios - 如何在 Xcode 中调试 ios 的 Metal 内核?

    java - 在Java中将日期转换为带时区的时间戳

    Android检查用户之前登录,否则开始登录 Activity

    java - 将内部存储中的 txt 文件与保管箱保管箱 api 中的 txt 文件同步

    java - ProgressBar持续时间和hasEnded方法

    OpenGL模糊

    java - 由于java没有引用,因此如何在两个单独的类之间传递信息?

    java - Java,使用SMTP发送邮件总是将邮件转到垃圾邮件文件夹,为什么?

    java - Quicksort Java中的无限循环