2012-09-16 7 views
14

私はアンドロイドアプリケーション用のカラーピッカーを実装しようとしていて、Android 4.1.1で奇妙な問題が発生しました。が enter image description hereAndroid 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); 

:2.3.7に次のコードは、Android 4.1.1に期待グラデーションを作成しませんが、それはありませんAndroid 4.1.1。上記のグラデーションについてお話します)

何が問題なのですか?私のコードには何かがないと思いますが、何も考えていません。

EDIT#1:輝く2.3.7に私は(ポップアップの背後にある)設定メニューのテキストを見ることができます:私はちょうどsetShaderためwhiteMaskを使用する場合は 、私はまた、両方のシステムのために異なる結果を得ますグラデーション矩形を通してさらに、左上端から右下端(黒から白)までの勾配がありますが、4.1.1の勾配は左から右に水平になります。私は、問題を説明するために、より単純な例を見つけだから、それはComposeShader

EDIT#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); 

を、我々はわずか垂直直線勾配を持っています任意の色を黒色に、水平線形勾配を黒色から白色に変換する。これらの2つのレイヤーを掛け合わせると、(上記の左のスクリーンショットのように)正しい長方形が得られるはずです。しかし、Android 4.1.1では、シェーダ2のグラデーションのみが表示されます。私もGimpで2つのレイヤーを試してみましたが、結果はAndroid 2.3.7と同じでした。

答えて

19

問題が見つかりました:ハードウェアアクセラレーションと関係があると思われます。説明したようにhere 'ComposeShaderには、異なるタイプのシェーダ(BitmapShaderとLinearGradientはありますが、BitmapShaderのインスタンスは2つありません)'のみが含まれています。しかし、 'アプリケーションがこれらの欠落している機能や制限のいずれかの影響を受ける場合は、setLayerType(View.LAYER_TYPE_SOFTWARE, null)を呼び出すことで、アプリケーションの影響を受けた部分のハードウェアアクセラレーションをオフにすることができます。

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

今はすべての罰金を:SDK 11.私のアプリは、SDK 7で始まるすべてのバージョンをサポートしているので、私はこの方法が利用可能であるかどうかを確認する必要があるため、この方法が使用可能であることを「私が見た

、。

+0

デフォルトでハードウェアアクセラレーションが適用されていますか?私はあなたから提供されたリンクでこの情報を見つけられませんでした。 – Marek

+0

わかりませんが、私はそう思っています:-) –

+2

また、ViewCompat.setLayerType(view、View.LAYER_TYPE_SOFTWARE、null);メソッド/ call in support-v4ライブラリもあります。 – Mavrik

関連する問題