手動で描画されるカスタムビューがあります。ものをビットマップに描画してから、そのビットマップをonDraw()で使用します。描画キャッシュを有効にすると、独自のビットマップを作成する代わりに、そのキャッシュを使用できることに気付きました。これは主に機能します。
現在、私のonDrawメソッドは次のようになっています。
protected void onDraw(Canvas canvas) {
canvas.drawBitmap(getDrawingCache(), 0, 0, null);
}
これは、私が試したエミュレーターで正しく機能します。ただし、StackOverflowErrorに関するクラッシュレポートが表示されます。レポートは次のようになります。
java.lang.StackOverflowError
at android.view.View.getDrawingCache(View.java:10481)
at android.view.View.getDrawingCache(View.java:10446)
at com.aragaer.jtt.JTTClockView.onDraw(JTTClockView.java:162)
at android.view.View.draw(View.java:10983)
at android.view.View.buildDrawingCache(View.java:10700)
at android.view.View.getDrawingCache(View.java:10481)
at android.view.View.getDrawingCache(View.java:10446)
and so on...
私はAndroidソースを見てきましたが、実際にはbuildDrawingCacheがdraw()を呼び出します。これはループを説明します。ただし、buildDrawingCache()は2回目の呼び出しですぐに返されるはずです。
ただし、PFLAG_DRAWING_CACHE_VALIDが設定されていない限り(source)、これは発生しません。また、そのフラグは、ビューが親にアタッチされている場合にのみ設定されるのではなく、ハードウェアアクセラレーションであり、レイヤータイプがLAYER_TYPE_NONE(再びソース)である場合にのみ設定されます。
問題は、レイヤータイプを明示的に「なし」ではないものに設定しても大丈夫ですか、それとも他のアプローチを使用する必要がありますか?はいの場合、どのタイプを選択する必要がありますか?