5

このコードは、ビットマップのアルファチャンネルを使用して単色(アルファ)の形状を描画します。例えばHoneycombハードウェアアクセラレーションがsetColorFilterで動作しないようです。

Bitmap alphaMask = bitmap.extractAlpha(); 
Paint paint = new Paint(); 
int color = Color.GRAY; 
... 
paint.setColor(color); 
paint.setColorFilter(new PorterDuffColorFilter(color, PorterDuff.Mode.DST_IN)); 
... 
canvas.drawBitmap(alphaMask, x, y, paint); 

、それは左のビットマップを取得し、それが右側に表示されるようにキャンバスに描画します:

enter image description here

しかし、それはハニカム(アンドロイド3.0)上では動作しません。ハードウェアアクセラレーションがオンになっているときそれは何に関係なく黒の形を描きます。色の値は無視されます。ただし、ICS(Android 4.0)ではハードウェアアクセラレーションを有効にしても問題ありません。

Romain Guy documented hereのように、いくつかのAPIがハードウェアアクセラレーションでサポートされていないことは知っていますか?どのような描画操作がサポートされていますか?ですが、サポートされていないものは使用していません。

さらに、setColorFilterはat this postで動作するはずです。

私のコードにハニカムでサポートされていないものがありますか?回避策はありますか?この場合、ハードウェアアクセラレーションをオンにしておきたいと思います。

おかげ

答えて

6

どのようにアンドロイド3.0扱わalpha8ビットマップのバグがありました。それはまったく私のせいだったので、これは大変残念です。しかし、この問題はAndroid 4.0では修正されました。

回避策は2つあります。 - ビューにソフトウェアレイヤータイプを設定する - 独自のビットマップを作成し、必要なものをレンダリングします。ハードウェアアクセラレーションされたCanvasの上にこのビットマップを描画できます。

+0

+1。非常に素晴らしい。落として私たちに知らせてくれてありがとう! :) – MrGomez

+1

こんにちは心配、あなたたちはAndroidで驚くべきことをした、謝罪する必要はありません!いずれにしても、私は描画をビットマップにして、ビットマップをハードウェアアクセラレーションされたキャンバスに描画するルートを終えました。私のために働く!ありがとうございました – cottonBallPaws

+0

@ littleFluffyKitty私はそれがすべてうまくいってうれしいです。ありがとう、@RomainGuy! – MrGomez

4

は、私はここで最高の答えはロマン・ガイからになるだろうと信じています。 Quoth he

ただし、説明している内容はうまくいくはずです。すべてのグラデーションモードと同様に、すべてのグラデーション がサポートされています。発生した問題について 再現可能なテストケースのバグを報告してください。 が修正されます。

この文が与えられた場合、発生している動作はバグです。これは、実際にcontacting the primary developer responsibleが提供できる最高の技術的修正であるケースの1つです。

彼はしかし、回避策を投稿しました:

を私は実装をチェックし、ハードウェアレンダラが現在 ComposeShader内部の異なる種類の唯一のシェーダをサポートしています。この は、グラデーション+ビットマップを使用できますが、2つのビットマップまたは2つのグラデーションを使用できないことを意味します。 グラディエント。 ハードウェアでサポートされていないものを実行するビューの場合は、をソフトウェアでレンダリングするようにsetLayerType(LAYER_TYPE_SOFTWARE, null)を使用することができます。

おそらく彼は私たちすべてをさらに啓発するためにここに投稿します。 He did. :)

+0

ありがとうございました。私はview.setLayerType(LAYER_TYPE_SOFTWARE、null)を設定しようとしましたが、キャンバスのonDraw()はまだハードウェアアクセラレーション( 'canvas.isHardwareAccelerated')を受けています。キャンバス自体がハードウェアアクセラレーションであってはならないと思われる。 – cottonBallPaws

+0

キャンバスをソフトウェアレンダリングする方法があれば誰でも知っていますか? – cottonBallPaws

+1

レイヤータイプをソフトウェアに設定します。ハードウェアCanvasを取得している場合は、レイヤーを間違った表示に設定している可能性があります。 –

関連する問題