6

私のアプリにはこのコードスニペットがあります

mView.setDrawingCacheEnabled(true);
mBitmap = Bitmap.createBitmap(mView.getDrawingCache());

ここで、mViewはFrameLayoutのカスタムサブクラスのインスタンスです。このアプリは、数千人のユーザーが利用して6か月間うまく機能しています。最近、createBitmap()に渡されたnullポインターに関するレポートがほとんどありません(おそらく同じユーザーからですが、確認できません)。ユーザーが使用しているハードウェアまたはAndroidのバージョンがわかりません。

直前にキャッシュを有効にしても、getDrawingCache()がnullを返す原因は何ですか?新しい電話のハードウェアアクセラレーションに関連していますか?ビットマップのRAMが不十分なためですか?他に何か?防ぐことはできますか?

編集:私はここhttp://tinyurl.com/7yranvjでこの解決策を見つけました。それは合理的な回避策ですか?

mBitmap = Bitmap.createBitmap(mView.getWidth(), mView.getHeight(),
        Bitmap.Config.ARGB_8888);
final Canvas canvas = new Canvas(mBitMap);
mView.draw(canvas);
4

1 に答える 1

0

実際、あなたの推測は正しかった。ハードウェア アクセラレーション レイヤーを使用している場合、描画キャッシュは使用できません。新しいデバイスではデフォルトでハードウェア アクセラレーションがオンになっているため、問題になる可能性があります。このように、単一ビューのハードウェア アクセラレーションをオフにすることができます。

if(android.os.Build.VERSION.SDK_INT >= 11) frame.setLayerType(LAYER_TYPE_SOFTWARE, null);
frame.setDrawingCacheEnabled(true);
于 2013-08-01T10:17:50.850 に答える