Sobes.tech
Junior

Aké metódy existujú na prekreslenie View v Android?

sobes.tech AI

Odpoveď od AI

Existuje niekoľko hlavných spôsobov, ako spravovať prekreslenie pohľadu v Android:

  • invalidate(): Táto metóda označuje aktuálny a všetky podriadené pohľady ako "znečistené", čo vyžaduje ich prekreslenie. Systém plánuje prechod kreslenia v budúcnosti (zvyčajne na nasledujúcom snímku). Používa sa, keď sa niečo zmení, čo ovplyvňuje vzhľad pohľadu (napríklad farba, text). Volá sa z akéhokoľvek vlákna.

  • postInvalidate(): Je podobná invalidate(), ale určená na volanie z pozadia vlákien. Posiela správu hlavnému vláknu UI na vykonanie invalidate().

  • requestLayout(): Táto metóda naznačuje, že pohľad vyžaduje prepočítanie svojho veľkosti a polohy. Vyvoláva prechod merania a rozloženia (measure and layout pass) po prekreslení. Používa sa, keď sa niečo zmení, čo ovplyvňuje veľkosť alebo umiestnenie pohľadu (napríklad pridanie/odstránenie podriadených prvkov, zmena paddingu). Volá sa iba z hlavného vlákna UI.

Ak sa zmení ako vzhľad, tak aj veľkosť/poloha pohľadu, často stačí zavolať requestLayout(), pretože zvyčajne volá invalidate() v procese. Avšak, priame zmeny iba vzhľadu vyžadujú iba invalidate().

Príklad použitia invalidate():

// Zmena farby pohľadu v hlavnom vlákne
myView.setBackgroundColor(Color.parseColor("#FF0000"));
myView.invalidate();

Príklad použitia postInvalidate() z pozadia vlákna:

new Thread(new Runnable() {
    @Override
    public void run() {
        // Zmena textu pohľadu v pozadí
        myView.setText("Nový text");
        myView.postInvalidate(); // Prekreslenie cez hlavné vlákno
    }
}).start();

Príklad použitia requestLayout():

// Zmena paddingu pohľadu a požiadanie o prepočítanie rozloženia v hlavnom vlákne
myView.setPadding(10, 10, 10, 10);
myView.requestLayout();

Dôležité je pochopiť životný cyklus kreslenia pohľadu:

  1. Zmena údajov (napríklad farby, textu, veľkosti).
  2. Volanie invalidate() alebo requestLayout().
  3. Plánovanie prekreslenia systémom.
  4. Prechod merania (measure pass) - volanie onMeasure().
  5. Prechod rozloženia (layout pass) - volanie onLayout().
  6. Prechod kreslenia (draw pass) - volanie onDraw().

Metóda invalidate() spúšťa kroky 6, zatiaľ čo requestLayout() spúšťa kroky 4, 5 a 6.