Junior
Como chamar a redrawing de uma View personalizada no Android?
sobes.tech IA
Resposta da IA
Existem várias formas de invalidar (invalidate) uma vista personalizada:
-
invalidate():
- Redesenha toda a vista.
- Agenda a chamada de
onDraw(). - Usado para uma redesenho simples sem especificar uma área concreta.
// Dentro da sua vista ou ao interagir com ela myCustomView.invalidate() -
invalidate(Rect dirty) ou invalidate(int left, int top, int right, int bottom):
- Redesenha apenas a área especificada da vista.
- É mais eficiente se as alterações afetarem apenas uma parte da vista.
// Redesenhar a área com coordenadas (10, 20) a (100, 150) myCustomView.invalidate(10, 20, 100, 150) // Ou usando Rect val dirtyRect = Rect(10, 20, 100, 150) myCustomView.invalidate(dirtyRect) -
postInvalidate():
- Seguro para ser chamado de qualquer thread, incluindo threads em segundo plano.
- Coloca a operação
invalidate()na fila de mensagens para execução no thread de UI.
// De um thread em segundo plano Thread { // Realiza cálculos longos // ... myCustomView.postInvalidate() }.start()
Comparação entre invalidate() e postInvalidate() :
| Método | Thread de execução | Seguro de thread em segundo plano | Propósito |
|---|---|---|---|
invalidate() |
Thread de UI | Não | Redesenho imediato (o mais possível na thread de UI) |
postInvalidate() |
Thread de UI | Sim | Redesenho diferido na fila de mensagens |
Relação com onDraw() :
Chamar qualquer um dos métodos invalidate(...) agenda a execução do método onDraw() da sua vista. O sistema Android combina várias solicitações de invalidação em uma só, se possível, para otimizar o desempenho. onDraw() é chamado apenas quando o sistema está pronto para redesenhar.
Quando usar cada método :
- Use
invalidate()quando estiver na thread de UI (por exemplo, no manipulador de clique, após uma animação) e as alterações afetarem toda a vista ou você não se importar com otimização por área. - Use
invalidate(Rect)ouinvalidate(int, int, int, int)para otimização, se as alterações afetarem apenas uma parte da vista, e estiver na thread de UI. - Use
postInvalidate()quando precisar chamar invalidate de uma thread em segundo plano. - Não chame
invalidate()oupostInvalidate()com muita frequência sem necessidade, pois isso pode afetar negativamente o desempenho. Chame-os apenas após alterações nos dados ou estado da vista que exijam uma atualização visual.