it-swarm.com.de

View.onDraw () --- Wann wird es aufgerufen?

Ich habe einen Aufruf von Log.d () in onDraw () meiner erweiterten Ansicht eingefügt, damit ich sehen konnte, wie oft und wann er aufgerufen wird. Es wird zur Instantiierung der Ansicht aufgerufen, was nicht überraschend ist. Aber dann merke ich, dass es bei jedem Tap, der von onTouchEvent () bearbeitet wird, aufgerufen wird, obwohl mein Code dort nichts mit Grafik zu tun hat. In der Dokumentation für Ansichten kann ich jedoch nicht herausfinden, wann onDraw () tatsächlich aufgerufen wird. Ich bin nicht wirklich besorgt über mein spezielles Projekt hier (dies ist kein Problem für mich), ich möchte nur wissen, ob es irgendwo eine Liste gibt oder etwas, das die Reihenfolge der Vorgänge für eine View zeigt, insbesondere was die Ursachen sind onDraw () um angerufen zu werden.

26
CptSupermrkt

AFAIK, onDraw () einer View wird aufgerufen, wenn:

  1. Die Ansicht wird zunächst gezeichnet
  2. Immer wenn invalidate () für die Ansicht aufgerufen wird

Invalidate kann von Ihnen oder dem System bei Bedarf aufgerufen werden. Beispielsweise ändern viele Ansichten ihr Aussehen auf Toouch, z. B. wenn ein EditText eine Kontur und einen Cursor erhält oder eine Schaltfläche sich im gedrückten Zustand befindet. Daher werden Ansichten bei Berührung neu gezeichnet.

Ich bin damit einverstanden, dass es schön wäre, ein Dokument zu haben, in dem die Arbeitsweise von Views detailliert beschrieben wird. Wenn eines existiert und jemand weiß, wo es zu finden ist, lass es uns wissen.

50
Raghav Sood

onDraw() wird aufgerufen, wenn invalidate() aufgerufen wird. 

Aber Sie sollten es für ViewGroups wissen: onDraw() wird nicht wie erwartet aufgerufen. Vielmehr onDispatchDraw()

In einer ViewGroup können Sie jedoch setWillNotDraw(false) im Konstruktor aufrufen, um onDraw() für invalidate() aufzurufen.

Schauen Sie sich an diese Antwort

11
Chad Bingham
  • Wenn Sie für eine Ansicht einen Hintergrund festlegen, der gezeichnet werden kann, zeichnet die Ansicht es für Sie, bevor Sie zu seiner onDraw () -Methode zurückrufen. 

  • onAttachedToWindow () wird aufgerufen, wenn die Ansicht an ein Fenster angehängt ist . Zu diesem Zeitpunkt hat es eine Fläche und beginnt mit dem Zeichnen. Beachten Sie, dass diese Es wird garantiert, dass die Funktion vor .__ aufgerufen wird. onDraw (Android.graphics.Canvas), kann jedoch jederzeit aufgerufen werden vor dem ersten onDraw - einschließlich vor oder nach onMeasure (int, int).

  • invalidate () markiert den von dirty definierten Bereich als gezeichnet. Ob Die Ansicht ist sichtbar, onDraw (Android.graphics.Canvas) wird um .__ aufgerufen. irgendwann in der Zukunft.

7
hasanghaforian

Es ist wichtig zu beachten, dass der Aufruf der invalidate () - Funktion ohne Argumente auf ein Minimum reduziert wird. Versuchen Sie stattdessen, die invalidate () - Funktion mit vier Argumenten zu maximieren nur der Teil des Blicks.

1
Gagandeep Singh

Zusätzlich zu den oben genannten: Die Soft-Tastatur verursacht nach der Größenänderung des Fensters eine View.invalidate () -> View.onDraw () - Sequenz, um die "Tastatur" sinnvoll unterzubringen. Ein benutzerdefiniertes View.onDraw () muss sich in einem Zustand befinden, der diese Möglichkeit vorwegnimmt.
Ein solches Phänomen erklärt, warum die App, die Sie auf einem Tablet mit Bluetooth-Tastatur entwickelt und getestet haben, zu den Hunden ging, sobald sie die reale Welt erreichte (-:

0
Bad Loser