Sobes.tech
Junior

¿Cómo llamar a la redibujo de una vista personalizada en Android?

sobes.tech AI

Respuesta de la IA

Existen varias formas de invalidar (invalidate) una vista personalizada:

  1. invalidate():

    • Vuelve a dibujar toda la vista.
    • Programa la llamada a onDraw().
    • Se usa para una redibujo simple sin especificar un área concreta.
    // Dentro de tu vista o al interactuar con ella
    myCustomView.invalidate()
    
  2. invalidate(Rect dirty) o invalidate(int left, int top, int right, int bottom):

    • Solo vuelve a dibujar la zona especificada de la vista.
    • Es más óptimo si los cambios afectan solo a una parte de la vista.
    // Redibuja el área con coordenadas (10, 20) a (100, 150)
    myCustomView.invalidate(10, 20, 100, 150)
    
    // O usando Rect
    val dirtyRect = Rect(10, 20, 100, 150)
    myCustomView.invalidate(dirtyRect)
    
  3. postInvalidate():

    • Es seguro llamarlo desde cualquier hilo, incluso desde hilos en segundo plano.
    • Coloca la operación invalidate() en la cola de mensajes para su ejecución en el hilo de la interfaz de usuario.
    // Desde un hilo en segundo plano
    Thread {
        // Realiza cálculos largos
        // ...
        myCustomView.postInvalidate()
    }.start()
    

Comparación entre invalidate() y postInvalidate():

Método Hilo de ejecución Seguro desde hilo en segundo plano Propósito
invalidate() Hilo de UI No Redibujo inmediato (lo más posible en el hilo de UI)
postInvalidate() Hilo de UI Redibujo diferido en la cola de mensajes

Relación con onDraw():

Llamar a cualquiera de los métodos invalidate(...) programa la ejecución del método onDraw() de tu vista. El sistema Android combina varias solicitudes de invalidación en una sola, si es posible, para optimizar el rendimiento. onDraw() solo se llama cuando el sistema está listo para redibujar.

Cuándo usar cada método:

  • Usa invalidate() cuando estés en el hilo de UI (por ejemplo, en un manejador de clics, después de una animación) y los cambios afectan toda la vista o no te importa optimizar por área.
  • Usa invalidate(Rect) o invalidate(int, int, int, int) para optimización si los cambios solo afectan a una parte de la vista y estás en el hilo de UI.
  • Usa postInvalidate() cuando necesites llamar a invalidate desde un hilo en segundo plano.
  • No llames a invalidate() o postInvalidate() con demasiada frecuencia sin necesidad, ya que puede afectar negativamente al rendimiento. Úsalos solo después de cambios en los datos o estado de la vista que requieran una actualización visual.