Junior
Jak vyvolat překreslení vlastního View v Androidu?
sobes.tech AI
Odpověď od AI
Existuje několik způsobů, jak vyvolat překreslení (invalidate) vlastního View:
-
invalidate():
- Překreslí celý View.
- Naplánuje volání
onDraw(). - Používá se pro jednoduché překreslení bez určení konkrétní oblasti.
// Uvnitř vašeho View nebo při interakci s ním myCustomView.invalidate() -
invalidate(Rect dirty) nebo invalidate(int left, int top, int right, int bottom):
- Překreslí pouze určenou oblast View.
- Je to efektivnější, pokud změny ovlivňují pouze část View.
// Překreslit oblast s souřadnicemi (10, 20) po (100, 150) myCustomView.invalidate(10, 20, 100, 150) // Nebo pomocí Rect val dirtyRect = Rect(10, 20, 100, 150) myCustomView.invalidate(dirtyRect) -
postInvalidate():
- Bezpečné volání z jakéhokoliv vlákna, včetně pozadí.
- Umístí operaci
invalidate()do fronty zpráv k provedení na UI vlákně.
// Volání z pozadí vlákna Thread { // Provádíme dlouhé výpočty // ... myCustomView.postInvalidate() }.start()
Porovnání invalidate() a postInvalidate():
| Metoda | Vlákno provádění | Bezpečnost z pozadí vlákna | Účel |
|---|---|---|---|
invalidate() |
UI vlákno | Ne | Okamžité překreslení (pokud je to možné na UI vlákně) |
postInvalidate() |
UI vlákno | Ano | Odložené překreslení vložením do fronty zpráv |
Vztah s onDraw():
Volání kteréhokoliv z metod invalidate(...) plánuje provedení metody onDraw() vašeho View. Android systém slučuje několik požadavků na invalidate do jednoho, pokud je to možné, pro optimalizaci výkonu. onDraw() je voláno pouze tehdy, když je systém připraven k překreslení.
Kdy použít každou metodu:
- Použijte
invalidate(), když jste na UI vlákně (například v obsluze kliknutí, po animaci) a změny ovlivňují celý View nebo vám nezáleží na optimalizaci podle oblasti. - Použijte
invalidate(Rect)neboinvalidate(int, int, int, int)pro optimalizaci, pokud změny ovlivňují pouze část View a jste na UI vlákně. - Použijte
postInvalidate(), když potřebujete volat invalidate z pozadí vlákna. - Nevolávejte
invalidate()nebopostInvalidate()příliš často bez potřeby, protože to může negativně ovlivnit výkon. Volte je pouze po změně dat nebo stavu View, které vyžadují vizuální aktualizaci.