2012-09-16 39 views
14

我只是想爲我的android應用程序實現一個顏色選擇器,並在Android 4.1.1上遇到了一個奇怪的問題。下面的代碼不會在Android 4.1.1創建預期的梯度,但它確實在2.3.7:在Android 4.1.1上使用ComposeShader問題

Shader fadeInRight = new LinearGradient(0, 0, pWidth, 0, 0x00000000, 0xFF000000, Shader.TileMode.CLAMP); 
Shader blackToWhite = new LinearGradient(0, 0, 0, pHeight, 0xFF000000, 0xFFFFFFFF, Shader.TileMode.CLAMP); 
Shader whiteMask = new ComposeShader(blackToWhite, fadeInRight, PorterDuff.Mode.DST_IN); 
Shader blackToColor = new LinearGradient(0, 0, pWidth, 0, 0xFF000000, hue, Shader.TileMode.CLAMP); 
Shader shader = new ComposeShader(blackToColor, whiteMask, PorterDuff.Mode.SCREEN); 
paint.setShader(shader); 
... 
canvas.drawRect(new Rect(0, 0, pWidth, pHeight), paint); 

這裏的問題: enter image description here

(忽略紅色框下方Android 4.1.1。我只是說上面的漸變)

任何想法有什麼不對?我認爲我的代碼中缺少一些東西,但我沒有任何想法,什麼。

編輯#1: 如果我只是用whiteMasksetShader,我也得到不同的結果爲兩個系統:在2.3.7,我可以看到配置菜單(這是彈出後面)的文本閃耀通過梯度矩形。此外,從左上角到右下角(從黑色到白色)有一個漸變,但4.1.1上的漸變從左到右水平。 所以它似乎是ComposeShader

編輯#2問題: 我發現了一個更簡單的例子來說明問題:

Shader shader1 = new LinearGradient(0, 0, 0, pHeight, hue, 0xffffffff, Shader.TileMode.CLAMP); 
Shader shader2 = new LinearGradient(0, 0, pWidth, 0, 0xff000000, 0xffffffff, Shader.TileMode.CLAMP); 
Shader shader = new ComposeShader(shader1, shader2, PorterDuff.Mode.MULTIPLY); 

因此,我們必須從僅僅是一種垂直線性漸變任何顏色變爲黑色和從黑色變爲白色的水平線性漸變。如果我們將這兩個圖層相乘,我們應該得到正確的矩形(如上面的左邊截圖所示)。但在Android 4.1.1上,我只看到shader2的漸變。我也在Gimp中嘗試了兩層,結果與Android 2.3.7相同。

回答

19

發現問題:看起來它與硬件加速有關。如所述here'ComposeShader只能包含不同類型的着色器(例如BitmapShader和LinearGradient,但不包含BitmapShader的兩個實例)'。但是,'如果您的應用程序受到任何這些缺少的功能或限制的影響,您可以通過撥打setLayerType(View.LAYER_TYPE_SOFTWARE, null)來關閉應用程序的受影響部分的硬件加速。

我看到,這個方法是可行的,因爲SDK 11.我的應用程序支持開始SDK 7的所有版本,所以我必須要檢查方法可用:

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

現在一切都很好。

+0

默認情況下是否應用硬件加速?我沒有在您提供的鏈接中找到這些信息。 – Marek

+0

不確定,但我認爲並希望如此:-) –

+2

還有'ViewCompat.setLayerType(view,View.LAYER_TYPE_SOFTWARE,null);'支持-v4庫中的方法/調用。 – Mavrik

相關問題