2012-08-11 32 views
21

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

45

AFAIK, eine Ansicht der OnDraw() wird aufgerufen, wenn:

  1. Der Blick zunächst gezogen wird
  2. 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.

+0

Dies ist nicht der Fall für 'ViewGroup's. Siehe meine Antwort http : //stackoverflow.com/a/34367199/1642079 –

7
  • 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.

+0

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

1

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.

8

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

0

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 (-:

Verwandte Themen