Sobes.tech
Junior

Comment déclencher le redessin d'une vue personnalisée dans Android?

sobes.tech IA

Réponse de l'IA

Il existe plusieurs façons d'invalider (invalidate) une vue personnalisée :

  1. invalidate() :

    • Redessine toute la vue.
    • Planifie l'appel à onDraw().
    • Utilisé pour un redessin simple sans spécifier une zone précise.
    // Dans votre vue ou lors d'une interaction
    myCustomView.invalidate()
    
  2. invalidate(Rect dirty) ou invalidate(int left, int top, int right, int bottom) :

    • Redessine uniquement la zone spécifiée de la vue.
    • Plus efficace si les modifications concernent seulement une partie de la vue.
    // Redessiner la zone avec les coordonnées (10, 20) à (100, 150)
    myCustomView.invalidate(10, 20, 100, 150)
    
    // Ou avec Rect
    val dirtyRect = Rect(10, 20, 100, 150)
    myCustomView.invalidate(dirtyRect)
    
  3. postInvalidate() :

    • Sécurisé pour être appelé depuis n'importe quel thread, y compris les threads en arrière-plan.
    • Place l'opération invalidate() dans la file de messages pour une exécution sur le thread UI.
    // Depuis un thread en arrière-plan
    Thread {
        // Effectuer des calculs longs
        // ...
        myCustomView.postInvalidate()
    }.start()
    

Comparaison entre invalidate() et postInvalidate() :

Méthode Thread d'exécution Sécurité depuis un thread en arrière-plan Objectif
invalidate() Thread UI Non Redessin immédiat (aussi possible dans le thread UI)
postInvalidate() Thread UI Oui Redessin différé via la file de messages

Relation avec onDraw() :

L'appel de l'une ou l'autre méthode invalidate(...) planifie l'exécution de la méthode onDraw() de votre vue. Le système Android combine plusieurs demandes d'invalidation en une seule, si possible, pour optimiser la performance. onDraw() n'est appelé que lorsque le système est prêt à redessiner.

Quand utiliser chaque méthode :

  • Utilisez invalidate() lorsque vous êtes dans le thread UI (par exemple, dans un gestionnaire de clics, après une animation) et que les modifications concernent toute la vue ou que vous ne souhaitez pas optimiser par zone.
  • Utilisez invalidate(Rect) ou invalidate(int, int, int, int) pour l'optimisation si les modifications concernent seulement une partie de la vue et que vous êtes dans le thread UI.
  • Utilisez postInvalidate() lorsque vous devez appeler invalidate depuis un thread en arrière-plan.
  • N'appelez pas invalidate() ou postInvalidate() trop fréquemment sans nécessité, car cela peut nuire à la performance. Appelez-les uniquement après des modifications de données ou d'état de la vue nécessitant une mise à jour visuelle.