3

手動で描画されるカスタムビューがあります。ものをビットマップに描画してから、そのビットマップを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(再びソース)である場合にのみ設定されます。

問題は、レイヤータイプを明示的に「なし」ではないものに設定しても大丈夫ですか、それとも他のアプローチを使用する必要がありますか?はいの場合、どのタイプを選択する必要がありますか?

4

1 に答える 1

6

getDrawingCache()ビュー自体が使用することを意図したものではありませんでした。親が管理します。ビューがハードウェアアクセラレーションされているときにフラグが設定されない理由は、「描画キャッシュ」がハードウェアアクセラレーションとは異なる意味を持つためです。ディスプレイリストのライフサイクルを制御するために使用されます。必要なときにフラグが設定されていても、目的の動作は得られません。

canvas.drawBitmap(getDrawingCache(), ...)ここには2つの解決策があります。独自のビットマップを作成するか、ビューで描画キャッシュを有効にするだけで、からは呼び出さないでくださいonDraw()。とにかく親があなたのためにそれをします!

于 2012-12-10T17:54:53.863 に答える