2012-08-11 23 views
21

Ho messo una chiamata a Log.d() nell'onDraw() della mia vista estesa, così ho potuto vedere con quale frequenza e quando è stata chiamata. Viene chiamato all'istanziazione della vista, il che non è sorprendente. Ma poi noto che viene richiamato su ogni tocco gestito da onTouchEvent(), anche se il mio codice non sta facendo nulla collegato in remoto alla grafica. Tuttavia, nel documentation per Views, non riesco a trovare nulla su quando viene chiamato effettivamente onDraw(). Non sono molto preoccupato per il mio particolare progetto qui (questo non causa problemi per me), vorrei solo sapere se c'è una lista da qualche parte o qualcosa che mostra l'ordine delle operazioni per una vista, in particolare quali sono le cause onDraw() per essere chiamato.View.onDraw() --- quando viene chiamato?

risposta

45

per quanto ne so, di una vista OnDraw() viene chiamato quando:

  1. La vista è inizialmente disegnato
  2. Ogni volta invalidate() è chiamato per la vista

Invalidate può essere chiamato da voi o la sistema ogni volta che è necessario. Ad esempio, molte viste cambiano il loro aspetto su Touch, come un EditText che ottiene un contorno e un cursore o un pulsante nello stato premuto. A causa di ciò, le viste vengono ridisegnate al tocco.

Sono d'accordo che sarebbe bello avere un documento che dettagliasse il funzionamento di Views, e se ne esiste uno e qualcuno sa dove trovarlo, fatecelo sapere.

+0

Questo non è il caso di 'ViewGroup's. Vedere la mia risposta http : //stackoverflow.com/a/34367199/1642079 –

7
  • Se si imposta un drawable sfondo per una vista, poi la vista disegnerà per voi prima di richiamare al suo metodo OnDraw().

  • onAttachedToWindow() viene chiamato quando la vista è collegata a una finestra. A questo punto ha una superficie e inizierà a disegnare. Si noti che questa funzione viene chiamata prima di onDraw (android.graphics.Canvas), tuttavia può essere chiamata in qualsiasi momento prima del primo onDraw - incluso prima o dopo onMeasure (int, int).

  • invalidate() contrassegna l'area definita da dirty come deve essere disegnata. Se la vista è visibile, onDraw (android.graphics.Canvas) verrà chiamato allo in un punto in futuro.

+0

È un modo che possiamo intercettare prima di richiamare suDraw(), vuoi controllare la mia domanda http://stackoverflow.com/questions/19052952/bitmap-change-will -fare-view-auto-refresh-prima-OnDraw-and-a prescindere-non valida – VinceStyling

1

Una cosa importante da tenere a mente è che cercano di ridurre al minimo la chiamata della funzione invalidate() senza argomenti. Cerca invece di massimizzare la funzione invalidate() con quattro argomenti. Poiché la visualizzazione dell'intera vista è molto costosa. La seconda variante aggiorna solo la parte della vista.

8

onDraw() viene chiamato quando viene chiamato invalidate().

Ma si dovrebbe sapere per i gruppi di vista: onDraw() non si chiamerà come previsto. Piuttosto, onDispatchDraw().

Tuttavia, in un ViewGroup è possibile chiamare setWillNotDraw(false) nel costruttore per rendere onDraw() da chiamare su invalidate().

Date un'occhiata a this answer

0

aggiuntive a quanto sopra: La tastiera morbida provoca una View.invalidate() -> View.onDraw() sequenza dopo il ridimensionamento della finestra per accogliere sensibilmente la 'tastiera' . Un utente View.onDraw() deve lasciare se stesso in uno stato che anticipa questa possibilità.
Un tale fenomeno spiega perché l'app che hai sviluppato e testato su un tablet con una tastiera bluetooth è andata ai cani una volta raggiunta la realtà (-:

Problemi correlati