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 :
-
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() -
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) -
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)ouinvalidate(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()oupostInvalidate()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.