Sobes.tech
Junior

Jaké metody existují pro překreslení View v Androidu?

sobes.tech AI

Odpověď od AI

Existuje několik hlavních metod pro správu překreslení pohledu (View) v Androidu:

  • invalidate(): Tato metoda označuje aktuální View a všechny její podřízené View jako "špinavé", což vyžaduje překreslení. Systém naplánuje průchod vykreslování v budoucnosti (obvykle při dalším snímku). Používá se, když se něco změnilo, co ovlivňuje vzhled View (například barva, text). Může být voláno z jakéhokoliv vlákna.

  • postInvalidate(): Podobné jako invalidate(), ale určeno k volání z pozadí vláken. Odesílá zprávu hlavnímu vláknu UI k provedení invalidate().

  • requestLayout(): Tato metoda označuje, že View potřebuje znovu spočítat svou velikost a pozici. Spouští průchod měření a rozložení (measure and layout pass) po překreslení. Používá se, když se něco změnilo, co ovlivňuje velikost nebo rozložení View (například přidání/odebrání podřízených prvků, změna paddingu). Volá se pouze z hlavního vlákna UI.

Pokud se změnilo jak vzhled, tak velikost/pozice View, často stačí zavolat requestLayout(), protože obvykle volá invalidate() v průběhu. Nicméně, přímá změna pouze vzhledu vyžaduje pouze invalidate().

Příklad použití invalidate():

// Změna barvy View v hlavním vlákně
myView.setBackgroundColor(Color.parseColor("#FF0000"));
myView.invalidate();

Příklad použití postInvalidate() z pozadí vlákna:

new Thread(new Runnable() {
    @Override
    public void run() {
        // Změna textu View v pozadí
        myView.setText("Nový text");
        myView.postInvalidate(); // Překreslení přes hlavní vlákno
    }
}).start();

Příklad použití requestLayout():

// Změna paddingu View a požadavek na nové rozložení v hlavním vlákně
myView.setPadding(10, 10, 10, 10);
myView.requestLayout();

Je důležité pochopit životní cyklus vykreslování View:

  1. Změna dat (například barva, text, velikost).
  2. Volání invalidate() nebo requestLayout().
  3. Plánování překreslení systémem.
  4. Přechod měření (measure pass) - volání onMeasure().
  5. Přechod rozložení (layout pass) - volání onLayout().
  6. Přechod vykreslení (draw pass) - volání onDraw().

Metoda invalidate() spouští krok 6, zatímco requestLayout() spouští kroky 4, 5 a 6.