Quais métodos existem para redesenhar uma View no Android?
sobes.tech IA
Resposta da IA
Existem vários métodos principais para gerir a redesenho de uma View em Android:
-
invalidate(): Este método marca a View atual e todas as suas Views filhas como "sujas", necessitando de um redesenho. O sistema planeia uma passagem de desenho no futuro (normalmente no próximo frame). É usado quando algo que afeta a aparência da View (por exemplo, cor, texto) mudou. Pode ser chamado de qualquer thread. -
postInvalidate(): Semelhante ainvalidate(), mas destinada a ser chamada a partir de threads em segundo plano. Envia uma mensagem ao thread principal da UI para executarinvalidate(). -
requestLayout(): Este método indica que a View necessita de recalcular o seu tamanho e posição. Ele invoca uma passagem de medição e disposição (measure and layout pass) após o redesenho. É usado quando algo que afeta o tamanho ou disposição da View mudou (por exemplo, adicionar/remover elementos filhos, alterar padding). É chamado apenas a partir do thread principal da UI.
Se tanto a aparência como o tamanho/posição da View mudaram, muitas vezes basta chamar requestLayout(), pois ele normalmente chama invalidate() no processo. No entanto, uma mudança direta apenas na aparência requer apenas invalidate().
Exemplo de uso de invalidate():
// Alterar a cor da View no thread principal
myView.setBackgroundColor(Color.parseColor("#FF0000"));
myView.invalidate();
Exemplo de uso de postInvalidate() a partir de um thread em segundo plano:
new Thread(new Runnable() {
@Override
public void run() {
// Alterar o texto da View em um thread em segundo plano
myView.setText("Novo texto");
myView.postInvalidate(); // Redesenhar através do thread principal
}
}).start();
Exemplo de uso de requestLayout():
// Alterar o padding da View e solicitar uma nova disposição no thread principal
myView.setPadding(10, 10, 10, 10);
myView.requestLayout();
É importante compreender o ciclo de vida do desenho da View:
- Alteração de dados (por exemplo, cor, texto, tamanho).
- Chamada a
invalidate()ourequestLayout(). - Planeamento do redesenho pelo sistema.
- Passagem de medição (measure pass) - chamada a
onMeasure(). - Passagem de disposição (layout pass) - chamada a
onLayout(). - Passagem de desenho (draw pass) - chamada a
onDraw().
O método invalidate() inicia o passo 6, enquanto que requestLayout() inicia os passos 4, 5 e 6.