2013-06-21 23 views
1

在我的應用程序中,我使用了我的自定義顏色選取器小部件。在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後再打開它嗎?誰能解釋一下?

回答

2

這與默認情況下啓用硬件加速(HA)的Android 4+有關。在4.0之前,你可以選擇在AndroidManifest.xml中啓用HA。

硬件加速執行使用GPU在視圖畫布上執行的所有繪圖操作,這很好,因爲它應該更快。但是,啓用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中

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

或按活動

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

或按次禁用HA爲您的整個應用程序,你現在正在做的事情。

請記住,存在着固定在4.1(見here),因此您的setLayerType(View.LAYER_TYPE_SOFTWARE, null)電話將在部分Android版本(4.0.2爲例)被忽略Android中的錯誤

如果爲視圖禁用HA,則不必再次啓用它,因爲HA僅影響視圖的繪圖。