Sobes.tech
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:

  1. 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()
    
  2. 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)
    
  3. 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) ou invalidate(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() ou postInvalidate() 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.