ハードウェア アクセラレーションされた Android アプリケーションがあります (マニフェストで android:hardwareAccelerated="true" )。問題のある動作に気付いたので、以下のテスト プログラムに要約しました。
単一の Bitmap オブジェクトを作成し、カスタム ビューの onDraw() が呼び出されるたびにその内容を変更すると、画面にレンダリングされたビットマップの内容は、ビットマップが最初に描画されたときと同じままになることがわかりました。カスタム ビューの onDraw() のコードは次のとおりです。
protected void onDraw(Canvas canvas)
{
if (m_bFirstDraw)
{
// This code is only run one time. It creates three pixel arrays: blue, green, and red
// Also a single bitmap object is created, to be modified and re-used in every onDraw() call.
m_bFirstDraw = false;
for (int i=0; i<3; i++)
{
m_aaiImage[i] = new int[this.getWidth() * this.getHeight()];
Arrays.fill(m_aaiImage[i], 0xFF << (i*8));
}
m_bmp = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.RGB_565);
}
// Now every time through the loop, use a different color
m_bmp.setPixels(m_aaiImage[m_iDrawNum%3], 0, getWidth(), 0, 0, getWidth(), getHeight());
canvas.drawBitmap(m_bmp, 0, 0, null);
m_iDrawNum++;
}
他の場所には、クリックするとカスタム ビューで invalidate() が呼び出され、onDraw() が呼び出されるボタンがあります。
ハードウェア アクセラレーションがオフの場合、すべてが期待どおりに機能します...ボタンを繰り返しクリックすると、画面が青、緑、赤、青、緑、赤と循環します...
ただし、ハードウェア アクセラレーションがオンの場合、色は常に同じです。最初に描画したときのビットマップの色に関係なく (上記のコードでは青です)。
これは予想される動作ですか?回避できますか?
私が呼び出した createBitmap() のオーバーロードに基づくドキュメントによると、ビットマップは変更可能です。可変でない場合は、例外がスローされます。また、私が説明したように、コードは一般的に正しいです。ハードウェアアクセラレーションがオフの場合、期待どおりに動作します。
どんな助けでも大歓迎です。