Sobes.tech
Junior

Quali metodi esistono per ridisegnare una View in Android?

sobes.tech AI

Risposta dell'AI

Esistono diversi metodi principali per gestire il ridisegno di una View in Android:

  • invalidate(): Questo metodo contrassegna la View corrente e tutte le sue View figlie come "sporche", richiedendo un ridisegno. Il sistema pianifica un passaggio di disegno in futuro (di solito nel prossimo frame). Viene usato quando qualcosa che influisce sull'aspetto della View (ad esempio, colore, testo) è cambiato. Può essere chiamato da qualsiasi thread.

  • postInvalidate(): Simile a invalidate(), ma progettato per essere chiamato da thread in background. Invia un messaggio al thread principale dell'UI per eseguire invalidate().

  • requestLayout(): Questo metodo indica che la View necessita di ricalcolare le proprie dimensioni e posizione. Innesca un passaggio di misura e layout (measure and layout pass) dopo il ridisegno. Viene usato quando qualcosa che influisce sulla dimensione o sulla disposizione della View è cambiato (ad esempio, aggiunta/rimozione di elementi figli, modifica del padding). Viene chiamato solo dal thread principale dell'UI.

Se sia l'aspetto che le dimensioni/posizione della View sono cambiate, spesso basta chiamare requestLayout(), poiché di solito chiama invalidate() nel processo. Tuttavia, una modifica diretta solo dell'aspetto richiede solo invalidate().

Esempio di utilizzo di invalidate():

// Cambiare il colore della View nel thread principale
myView.setBackgroundColor(Color.parseColor("#FF0000"));
myView.invalidate();

Esempio di utilizzo di postInvalidate() da un thread in background:

new Thread(new Runnable() {
    @Override
    public void run() {
        // Modificare il testo della View in un thread in background
        myView.setText("Nuovo testo");
        myView.postInvalidate(); // Ridisegna tramite il thread principale
    }
}).start();

Esempio di utilizzo di requestLayout():

// Modificare il padding della View e richiedere un nuovo layout nel thread principale
myView.setPadding(10, 10, 10, 10);
myView.requestLayout();

È importante comprendere il ciclo di vita del disegno di una View:

  1. Cambio dei dati (ad esempio, colore, testo, dimensione).
  2. Chiamata a invalidate() o requestLayout().
  3. Pianificazione del ridisegno da parte del sistema.
  4. Passaggio di misura (measure pass) - chiamata a onMeasure().
  5. Passaggio di layout (layout pass) - chiamata a onLayout().
  6. Passaggio di disegno (draw pass) - chiamata a onDraw().

Il metodo invalidate() avvia il passo 6, mentre requestLayout() avvia i passi 4, 5 e 6.