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é jakoinvalidate(), 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:
- Změna dat (například barva, text, velikost).
- Volání
invalidate()neborequestLayout(). - Plánování překreslení systémem.
- Přechod měření (
measure pass) - voláníonMeasure(). - Přechod rozložení (
layout pass) - voláníonLayout(). - Přechod vykreslení (
draw pass) - voláníonDraw().
Metoda invalidate() spouští krok 6, zatímco requestLayout() spouští kroky 4, 5 a 6.