Sobes.tech
Junior

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 a invalidate(), mas destinada a ser chamada a partir de threads em segundo plano. Envia uma mensagem ao thread principal da UI para executar invalidate().

  • 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:

  1. Alteração de dados (por exemplo, cor, texto, tamanho).
  2. Chamada a invalidate() ou requestLayout().
  3. Planeamento do redesenho pelo sistema.
  4. Passagem de medição (measure pass) - chamada a onMeasure().
  5. Passagem de disposição (layout pass) - chamada a onLayout().
  6. 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.