Sobes.tech
Junior

Quelles méthodes existent pour redessiner une vue dans Android?

sobes.tech IA

Réponse de l'IA

Il existe plusieurs méthodes principales pour gérer le redessinage d'une Vue en Android :

  • invalidate(): Cette méthode marque la vue actuelle et toutes ses vues enfants comme "sales", nécessitant un redessinage. Le système planifie une étape de dessin dans le futur (habituellement lors du prochain frame). Elle est utilisée lorsque quelque chose affectant l'apparence de la vue (par exemple, couleur, texte) a changé. Peut être appelée depuis n'importe quel thread.

  • postInvalidate(): Semblable à invalidate(), mais conçue pour être appelée depuis des threads en arrière-plan. Elle envoie un message au thread principal de l'UI pour exécuter invalidate().

  • requestLayout(): Cette méthode indique que la vue doit recalculer sa taille et sa position. Elle déclenche une étape de mesure et de disposition (measure and layout pass) après le redessinage. Utilisée lorsque quelque chose affectant la taille ou la disposition de la vue a changé (par exemple, ajout/suppression d'éléments enfants, modification du padding). Appelée uniquement depuis le thread principal de l'UI.

Si à la fois l'apparence et la taille/position de la vue ont changé, il est souvent suffisant d'appeler requestLayout(), car il appelle généralement invalidate() dans le processus. Cependant, une modification directe uniquement de l'apparence nécessite seulement invalidate().

Exemple d'utilisation de invalidate() :

// Changer la couleur de la vue dans le thread principal
myView.setBackgroundColor(Color.parseColor("#FF0000"));
myView.invalidate();

Exemple d'utilisation de postInvalidate() depuis un thread en arrière-plan :

new Thread(new Runnable() {
    @Override
    public void run() {
        // Modifier le texte de la vue dans un thread en arrière-plan
        myView.setText("Nouveau texte");
        myView.postInvalidate(); // Redessiner via le thread principal
    }
}).start();

Exemple d'utilisation de requestLayout() :

// Modifier le padding de la vue et demander une nouvelle disposition dans le thread principal
myView.setPadding(10, 10, 10, 10);
myView.requestLayout();

Il est important de comprendre le cycle de vie du dessin d'une vue :

  1. Changement de données (par exemple, couleur, texte, taille).
  2. Appel à invalidate() ou requestLayout().
  3. Planification du redessinage par le système.
  4. Passage de mesure (measure pass) - appel à onMeasure().
  5. Passage de disposition (layout pass) - appel à onLayout().
  6. Passage de dessin (draw pass) - appel à onDraw().

La méthode invalidate() lance l'étape 6, tandis que requestLayout() lance les étapes 4, 5 et 6.