Sobes.tech
Junior

Come chiamare il ridisegno di una View personalizzata in Android?

sobes.tech AI

Risposta dell'AI

Esistono diversi modi per invalidare (invalidate) una vista personalizzata:

  1. invalidate():

    • Ridisegna l'intera vista.
    • Programma la chiamata a onDraw().
    • Utilizzato per un ridisegno semplice senza specificare un'area particolare.
    // All'interno della tua vista o durante l'interazione con essa
    myCustomView.invalidate()
    
  2. invalidate(Rect dirty) o invalidate(int left, int top, int right, int bottom):

    • Ridisegna solo l'area specificata della vista.
    • È più efficiente se le modifiche riguardano solo una parte della vista.
    // Ridisegna l'area con coordinate (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():

    • È sicuro chiamarlo da qualsiasi thread, inclusi thread in background.
    • Inserisce l'operazione invalidate() nella coda dei messaggi per l'esecuzione sul thread UI.
    // Da un thread in background
    Thread {
        // Esegue calcoli lunghi
        // ...
        myCustomView.postInvalidate()
    }.start()
    

Confronto tra invalidate() e postInvalidate():

Metodo Thread di esecuzione Sicurezza da thread in background Scopo
invalidate() Thread UI No Ridisegno immediato (il più possibile nel thread UI)
postInvalidate() Thread UI Ridisegno differito tramite la coda dei messaggi

Relazione con onDraw():

Chiamare uno qualsiasi dei metodi invalidate(...) pianifica l'esecuzione del metodo onDraw() della tua vista. Il sistema Android combina più richieste di invalidazione in una sola, se possibile, per ottimizzare le prestazioni. onDraw() viene chiamato solo quando il sistema è pronto per ridisegnare.

Quando usare ogni metodo:

  • Usa invalidate() quando sei nel thread UI (ad esempio, in un gestore di clic, dopo un'animazione) e le modifiche riguardano l'intera vista o non ti interessa ottimizzare per area.
  • Usa invalidate(Rect) o invalidate(int, int, int, int) per ottimizzazione, se le modifiche riguardano solo una parte della vista e sei nel thread UI.
  • Usa postInvalidate() quando devi chiamare invalidate da un thread in background.
  • Non chiamare invalidate() o postInvalidate() troppo spesso senza motivo, poiché ciò può influire negativamente sulle prestazioni. Chiamali solo dopo modifiche ai dati o allo stato della vista che richiedono un aggiornamento visivo.