【问题标题】:Compose two Shaders (Color Picker)组合两个着色器(拾色器)
【发布时间】:2016-12-31 21:55:48
【问题描述】:

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

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

但是,我得到的结果并不是我想要得到的。 下面你可以看到上面提到的Shaders的样子:
+ =

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


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

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

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

但是我并不真正理解这行代码如何影响我的应用程序。我的意思是 IU 明白它设置了HARDWARE ACCELERATION,这样做对我的应用程序有什么后果吗?画完Shader后要不要再开机?谁能解释一下?

【问题讨论】:

    标签: java android shader android-canvas


    【解决方案1】:

    这与默认启用硬件加速 (HA) 的 Android 4+ 有关。在 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 仅影响视图的绘制。

    【讨论】:

      猜你喜欢
      • 2019-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-29
      • 1970-01-01
      相关资源
      最近更新 更多