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.
- 1. Wann sollte IDisposable implementiert werden?
- 2. Wann sollte WS_EX_NOREDIRECTIONBITMAP verwendet werden?
- 3. Wann sollte wkWebView verwendet werden?
- 4. Wann sollte StringBuilder verwendet werden?
- 5. Wann sollte FOUNDATION_EXPORT verwendet werden?
- 6. Wann sollte Flask.g verwendet werden?
- 7. Wann sollte $ .extend ({...}) verwendet werden?
- 8. Wann sollte range.value verwendet werden?
- 9. Wann sollte dynamic_cast der Referenz verwendet werden?
- 10. Welches sollte zuerst gezeichnet werden, Klassen- oder Sequenzdiagramm?
- 11. Wann sollte das Schlüsselwort "as" und wann() Casting verwendet werden?
- 12. Wann sollte dies-> verwendet werden?
- 13. Wann sollte ein neuer Ausnahmetyp verwendet werden?
- 14. Wann sollte ein IOC-Container verwendet werden?
- 15. Wann sollte in Rust inline verwendet werden?
- 16. Wann sollte ENOMEM errno zugewiesen werden?
- 17. Wann sollte ein Singleton verwendet werden?
- 18. Wann sollte ein Event Bus verwendet werden?
- 19. Wann sollte std :: atomic_compare_exchange_strong verwendet werden?
- 20. Wann sollte die Ausnahme behandelt werden?
- 21. Wann sollte target = "_ self" verwendet werden?
- 22. Wann sollte eine IllegalArgumentException ausgelöst werden?
- 23. Wann sollte assert() in Matlab verwendet werden?
- 24. Wann sollte StringProperty über String verwendet werden?
- 25. Wann sollte die didMoveToWindow-Methode verwendet werden?
- 26. Wann sollte ein ManualResetEvent entfernt werden?
- 27. Wann sollte der Cloud-Server verwendet werden?
- 28. Wann sollte self für Klasseneigenschaften verwendet werden?
- 29. Wann sollte Theme.AppCompat vs ThemeOverlay.AppCompat verwendet werden?
- 30. Wann sollte RecyclerView's holder.itemView.performClick() korrekt aufgerufen werden?