Quand il est nécessaire d'exécuter invalidate() sur un point de Vue?
Ma réponse à cette question vient d'être accepté, mais j'ai commencé à me demander quand exactement on doit invalidate() Vue et quand il n'est pas nécessaire?
Après un peu de réflexion j'en suis venu à la réalisation que c' devrait de travail plus ou moins comme ceci:
- le dessin de "tout" se passe après
onResume()
- en temps "libres" des parties de l'écran peut être redessiné, mais seulement ceux qui ont été
invalidated
(et tout en dessous)
Il semblerait donc, si je change quelque chose après onResume()
(par exemple, comme une réponse à un clic sur un bouton, je devrais invalidate()
la changé View
).
Cependant, de ce que scana dans cette question dit, il doit être plus complexe et cela dépend somethimes sur la méthode qu'on utilise.
E. g. si l'on utilise
lastClicked.setImageBitmap();
ou
lastClicked.setImageResource();
Donc, quand il est nécessaire d'exécuter invalidate() sur une Vue et comment ça marche vraiment ?
Vous devez vous connecter pour publier un commentaire.
D'habitude, le système de poignées de redimensionnement, masquer, afficher et une tonne d'autres choses pour vos widgets automatiquement mais il a parfois des problèmes si le sous-jacent de la mémoire tampon pour dessinés pixels ou de sauvegarde de données a été modifié ou est obsolète (vous remplacez la ressource d'image sur une Vue ou cru, le dataset changements). Ce problème se produit car il n'y a aucun moyen pour que l'OS puisse savoir que les données ont changé dans la façon qu'il a fait.
Dans ces cas où vous faites affaire avec le dessin, vous devez indiquer au système que ses données sous-jacente n'est pas dans un bon état avec Widget.invalidate() et le re-dessin devient de file d'attente sur le thread principal, juste comme vous l'avez mentionné. En fonction de la mise en œuvre du système et de la version Android de ce qui est suivi pour les changements par le système varie, mais ce que j'ai l'habitude de faire est de supposer que les ressources du système (tableaux d'octets, des tableaux de char, des ressources indices, manuel de dessin sur le contexte) ne sont pas suivis et ont besoin d'une invalider et tout le reste sera géré par le système.
(Ne envisager d'accepter des réponses)
Généralement,
invalidate()
signifie " redessiner sur l'écran, et les résultats d'un appel de la vueonDraw()
méthode. Donc, si quelque chose change, et elle doit être réfléchie sur l'écran, vous devez appelerinvalidate()
. Toutefois, pour les construit dans les widgets, vous pouvez rarement, si jamais, besoin d'appeler vous-même. Lorsque vous modifiez l'état d'un widget, code interne va appelerinvalidate()
tant que de besoin et votre changement pourra être répercuté sur l'écran. Par exemple, si vous appelezTextView.setText()
, après avoir fait beaucoup de traitement interne (le texte de l'adapter à l'écran, est-il besoin d'être ellipsised, etc.),TextView
appellerainvalidate()
avantsetText()
retourne. De même pour les autres widgets.Si vous décidez d'appliquer une vue personnalisée, vous aurez besoin de faire appel
invalidate()
chaque fois que la sauvegarde des changements de modèle et vous avez besoin de redessiner votre point de vue. Il peut également être utilisé pour créer des animations simples, où vous modifiez l'état, puis d'appelerinvalidate()
, changement d'état, etc.Rappelez-vous que le dessin sur l'écran est fréquente de processus, chaque fois que vous mettez un point de vue, ce changement doit être propogated et redessiné à notifier ce changement de droite.
invalidate()
est un déclencheur de la méthode,que les signaux de la force de retraçage de tout point de vue que vous souhaitez afficher les modifications.J'ai eu ce problème quand j'ai voulu dessiner un textPaint!
Mon code a été
J'ai effacé le premier de la charpie et le problème a été résolu