2012-03-27 8 views
0

私はSurfaceViewを読んでおり、その使い方は、SurfaceViewにはデフォルトでView#willNotDraw()がfalseに設定されており、SurfaceView#onDraw()に電話するのはあなた次第ですという情報があります。私はRomainGuyがこれがより効率的であるため、これがデフォルトで行われているとも言いました。今私の質問は、別のスレッドでSurfaceView#onDraw()を呼び出す処理を行うべきときで、View#willNotDraw()trueに設定し、ちょうどSurfaceView#invalidate()と呼ぶべきです。両者の違いはありますか?また、パフォーマンスが他のものよりも向上していますか?いつSurfaceViewをUIスレッドで描画させるべきですか?

答えて

1

参照:

http://developer.android.com/reference/android/view/View.html#setWillNotDraw(boolean)

、あなたの情報を得たところ、私はわからないんだけど、少なくとも、javadocツールは、ほとんどのユーザーは、AndroidはそれをonDrawイベント自体を送信するために取得するためにfalseにこれを設定することを言います。いつあなたがこれを行うべきかについてあなたの質問については、私はそれがSurfaceViewを使用している理由になると言います。

あなたのビューが動的なもの(例えば、ゲームやタイトなイベントループを持つものなど)を表示している場合は、更新がいつ発生するかを正確に制御したいと思うでしょう。特に、 invalidateのより詳細な形式は、View全体の再描画を節約します。あなたはAndroidがinvalidateに電話するのを望んでおらず、その理由がそこにあります。

一方、単純に静的なものを描画している場合は、AndroidのUIスタックに無効化を制御させることが理にかなっています。ところで

invalidateだけあなたは(onDrawは、あなたがそれを呼び出すいつか後に呼び出されます)イベントループのスタイルを使用する場合ので、これを認識して、再描画Viewに要求をポストします。

編集:いくつかの説明。

1

SurfaceView.onDraw()とSurfaceView.invalidate()を使用すると、SurfaceViewが通常のViewのように動作し、SurfaceViewに関連する余分なオーバーヘッドが発生します。 UIスレッドから描画する場合は、代わりに通常のビューを使用します。それはより簡単で安価です。

関連する問題