Ich lese auf SurfaceView
und wie man es verwendet, und ich bin auf einige Informationen gestoßen, die besagt, dass ein SurfaceView
standardmäßig auf false festgelegt hat, und dass es an Ihnen liegt, SurfaceView#onDraw()
aufzurufen. Ich habe auch gelesen, dass RomainGuy sagte, dass dies standardmäßig getan wird, weil es effizienter ist. Meine Frage ist nun, wann sollten Sie anrufen SurfaceView#onDraw()
in einem separaten Thread behandeln, und wann sollten Sie setzen nur View#willNotDraw()
zu true
, und rufen Sie einfach SurfaceView#invalidate()
. Gibt es einen Unterschied zwischen den beiden, und verbessert man die Leistung mehr als die andere?Wann sollte SurfaceView vom UI-Thread gezeichnet werden?
Antwort
See:
http://developer.android.com/reference/android/view/View.html#setWillNotDraw(boolean)
Ich bin nicht sicher, wo Sie Ihre Informationen bekommen, aber zumindest die javadoc sagt, dass die meisten Benutzer dies false
gesetzt wird Android, um es selbst onDraw
Ereignisse zu senden. Was Ihre Frage, wann Sie dies tun sollten, würde ich sagen, es kommt darauf an, warum Sie ein SurfaceView
verwenden.
Wenn Ihre Ansicht etwas Dynamisches anzeigt (z. B. für ein Spiel oder etwas, das eine enge Ereignisschleife hat), möchten Sie genau steuern, wann Updates durchgeführt werden, insbesondere wenn Sie die Informationen haben, um eines davon zu verwenden die detailliertere Formen der invalidate
speichern die gesamte View
neu erstellt. Sie werden nicht möchten, dass Android für Sie invalidate
aufruft, und deshalb ist die Flagge da.
Wenn auf der anderen Seite, können Sie einfach statisch etwas zeichnen sind, macht es Sinn, Android UI-Stack die Ungültigkeits steuern zu lassen.
By the way, invalidate
nur eine Anfrage bucht die View
, so beachten Sie dies erneut zu ziehen, wenn Sie das Ereignis-Loop-Stil verwenden möchten (onDraw
wird irgendwann werden nach Sie es nennen genannt).
Edit: einige Präzisierungen.
Mit SurfaceView.onDraw() und SurfaceView.invalidate() wird Surface wie eine normale Ansicht verhalten, und Sie werden für den zusätzlichen Aufwand mit Surface zugeordnet zahlen. Wenn Sie vom UI-Thread zeichnen möchten, verwenden Sie stattdessen eine normale Ansicht. Es ist einfacher und billiger.