Ich habe einen Aufruf von Log.d() in das onDraw() meiner erweiterten Ansicht eingefügt, damit ich sehen konnte, wie oft und wann es aufgerufen wird. Es wird auf die Instanziierung der Ansicht hingewiesen, was nicht überraschend ist. Aber dann merke ich, dass es bei jedem Tippen, das von onTouchEvent() gehandhabt wird, aufgerufen wird, obwohl mein Code dort nichts mit Grafiken zu tun hat. In der documentation für Views kann ich jedoch nichts darüber finden, wann onDraw() tatsächlich aufgerufen wird. Ich bin nicht wirklich besorgt über mein spezielles Projekt hier (dies verursacht kein Problem für mich), ich möchte nur wissen, ob es irgendwo eine Liste gibt oder etwas, das die Reihenfolge der Operationen für eine Ansicht anzeigt, insbesondere was verursacht onDraw() um angerufen zu werden.View.onDraw() --- wann wird es aufgerufen?
Antwort
AFAIK, eine Ansicht der OnDraw() wird aufgerufen, wenn:
- Der Blick zunächst gezogen wird
- Wenn invalidate() auf der Ansicht aufgerufen wird
Invalidate von Ihnen aufgerufen werden können, oder die System wann immer nötig. Zum Beispiel ändern viele Ansichten, wie sie auf Touch aussehen, wie ein EditText, der einen Umriss und einen Cursor erhält, oder eine Schaltfläche, die sich im gedrückten Zustand befindet. Aus diesem Grund werden Ansichten bei Berührung neu gezeichnet.
Ich stimme zu, dass es nett wäre, ein Dokument zu haben, das die Arbeit von Views detailliert beschreibt, und wenn jemand existiert und jemand weiß, wo er es finden kann, lassen Sie es uns bitte wissen.
Wenn Sie einen Hintergrund ziehbar für eine Ansicht gesetzt, dann wird die Ansicht es für Sie ziehen vor seiner OnDraw() -Methode aufrufen zurück.
onAttachedToWindow() wird aufgerufen, wenn die Ansicht an ein Fenster angehängt ist. An dieser Stelle hat es eine Oberfläche und beginnt mit dem Zeichnen. Beachten Sie, dass diese Funktion garantiert vor onDraw (android.graphics.Canvas) aufgerufen wird, aber es kann jederzeit vor dem ersten onDraw aufgerufen werden - einschließlich vor oder nach onMeasure (int, int).
invalidate() markieren Sie den Bereich, der von dirty definiert wurde, als gezeichnet werden muss. Wenn die Ansicht sichtbar ist, wird onDraw (android.graphics.Canvas) unter irgendwann in der Zukunft aufgerufen werden.
Ist ein Weg, den wir abfangen können, bevor Sie onDraw() zurückrufen, möchten Sie meine Frage http://stackoverflow.com/questions/19052952/bitmap-change-will überprüfen -make-view-auto-refresh-vor-ondraw-und-unabhängig-invalid – VinceStyling
Eine wichtige Sache im Auge zu behalten ist, dass versuchen, ohne Argumente Berufung invalidate() Funktion zu minimieren. Versuchen Sie stattdessen, die Funktion invalidate() mit vier Argumenten zu maximieren. Das Zeichnen der gesamten Ansicht ist sehr teuer. Die zweite Variante aktualisiert nur den Teil der Ansicht.
onDraw()
wird aufgerufen, wenn invalidate()
aufgerufen wird.
Aber Sie sollten für ViewGroups wissen: onDraw()
wird nicht genannt werden, wie Sie erwarten. Eher, onDispatchDraw()
.
In einer ViewGroup können Sie jedoch setWillNotDraw(false)
im Konstruktor aufrufen, damit onDraw()
unter invalidate()
aufgerufen wird.
Werfen Sie einen Blick auf this answer
Zusätzlich zum oben: Die Soft-Tastatur verursacht eine View.invalidate() -> View.onDraw() Reihenfolge nach der Größe des Fensters der ‚Tastatur‘, um vernünftig unterbringen . Eine benutzerdefinierte View.onDraw() muss sich in einem Zustand verlassen, der diese Möglichkeit vorwegnimmt.
Solch phänomenum erklärt, warum die App, die Sie auf einem Tablet mit einer Bluetooth-Tastatur entwickelt und getestet haben, an die Hunde ging, sobald sie die reale Welt erreicht hat (-:
- 1. Wann wird Control.DestroyHandle aufgerufen?
- 2. Wann wird ServiceConnection.onServiceDisconnected() aufgerufen?
- 3. Wann wird DbConnection.StateChange aufgerufen?
- 4. Wann wird 'drawRect' aufgerufen?
- 5. Wann wird onSizeChanged() aufgerufen?
- 6. Wann wird onRestoreInstanceState aufgerufen?
- 7. Wann wird document.ready() aufgerufen?
- 8. Wann wird InitWithCoder aufgerufen?
- 9. Wann wird Angular2 ngAfterViewInit aufgerufen?
- 10. Wann wird UIViewController viewDidUnload aufgerufen?
- 11. Wann wird getPlaceholderTemplateForComplication() -Methode aufgerufen?
- 12. Wann wird Move Constructor aufgerufen?
- 13. Spielt es eine Rolle, wann Super in Dealloc aufgerufen wird?
- 14. View.invalidate() scheint View.onDraw() nicht aufzurufen
- 15. Wann wird die Methode - [UIView drawRect:] aufgerufen?
- 16. Wann wird OnValidate in Linq aufgerufen?
- 17. Wann wird ExecutionContext # reportFailure (Throwable) aufgerufen?
- 18. Wann wird TInterfacedObject.Destroy aufgerufen (eine ScopedLock-Klasse)
- 19. Wann wird ein Managed Bean-Konstruktor aufgerufen?
- 20. Wann wird ein Körper onLoad aufgerufen?
- 21. Wann wird die layoutSubviews-Methode aufgerufen?
- 22. Wann wird eine Unterroutine in @INC aufgerufen?
- 23. ASP MVC: Wann wird IController Dispose() aufgerufen?
- 24. Wann wird ein Kopierkonstruktor in cpp aufgerufen?
- 25. Wann wird Session_End() in ASP.NET MVC aufgerufen?
- 26. Wann wird der Python __call__ aufgerufen?
- 27. Wann wird die Validierungsmethode in Rails aufgerufen?
- 28. Wann wird der SignalR-Hub-Konstruktor aufgerufen?
- 29. Objective-C Klassenvariablen: Wann wird Dealloc aufgerufen?
- 30. Wann wird ajaxError aufgerufen, wenn $ .ajax verwendet wird?
Dies ist nicht der Fall für 'ViewGroup's. Siehe meine Antwort http : //stackoverflow.com/a/34367199/1642079 –