web-dev-qa-db-fra.com

View.onDraw () --- quand est-il appelé?

Je mets un appel Log.d () dans la méthode onDraw () de ma vue étendue afin que je puisse voir à quelle fréquence et à quel moment il est appelé. Il est appelé à l’instanciation de la vue, ce qui n’est pas surprenant. Mais ensuite, je remarque que l’appel est appelé à chaque tap manipulé par onTouchEvent (), même si mon code n’exécute rien qui soit relié aux images à distance. Cependant, dans documentation for Views, je ne trouve rien qui puisse indiquer quand onDraw () est appelé. Je ne suis pas vraiment préoccupé par mon projet particulier ici (cela ne pose pas de problème pour moi), je voudrais juste savoir s'il existe une liste quelque part ou quelque chose qui indique l'ordre des opérations pour une vue, en particulier les causes onDraw () pour être appelé.

26
CptSupermrkt

Autant que je sache, onDraw () d'une vue est appelée lorsque:

  1. La vue est initialement dessinée
  2. Chaque fois que invalidate () est appelé dans la vue

Invalidate peut être appelé par vous ou par le système à tout moment. Par exemple, beaucoup de vues changent leur apparence onTouch, par exemple un EditText obtenant un contour et un curseur, ou un bouton étant à l'état enfoncé. Pour cette raison, les vues sont redessinées au toucher.

Je conviens qu’il serait agréable d’avoir un document détaillant le fonctionnement de Views, et s’il en existe un et que l’on sache où le trouver, merci de nous le faire savoir.

50
Raghav Sood

onDraw() est appelé quand invalidate() est appelé. 

Mais vous devez savoir pour ViewGroups: onDraw() ne s'appellera pas comme vous le souhaitiez. Plutôt, onDispatchDraw()

Cependant, dans un ViewGroup, vous pouvez appeler setWillNotDraw(false) dans le constructeur pour faire appeler onDraw() à invalidate().

Jetez un oeil à cette réponse

11
Chad Bingham
  • Si vous définissez un fond pouvant être dessiné pour une vue, celle-ci dessine pour vous avant de rappeler sa méthode onDraw (). 

  • onAttachedToWindow () est appelée lorsque la vue est attachée à une fenêtre . À ce stade, il a une surface et commencera à dessiner. Notez que ceci la fonction est garantie d'être appelée avant onDraw (Android.graphics.Canvas), mais il peut être appelé à tout moment avant le premier onDraw - y compris avant ou après onMeasure (int, int).

  • invalidate () marque la zone définie par sale comme devant être dessinée. Si la vue est visible, onDraw (Android.graphics.Canvas) sera appelé à un point dans le futur.

7
hasanghaforian

Une chose importante à garder à l'esprit est que vous essayez de minimiser l'appel de la fonction invalidate () sans argument . Essayez plutôt de maximiser la fonction invalidate () avec quatre arguments. seulement la partie de la vue.

1
Gagandeep Singh

Complémentaire de ce qui précède: le clavier logiciel provoque une séquence View.invalidate () -> View.onDraw () / après le redimensionnement de la fenêtre afin d’adapter de manière judicieuse le «clavier». Un View.onDraw () personnalisé doit se laisser dans un état qui anticipe cette possibilité.
Un tel phénomène explique pourquoi l’application que vous avez développée et testée sur une tablette avec un clavier Bluetooth a été transmise aux chiens une fois qu’elle a atteint le monde réel (-:

0
Bad Loser