Junior
Ako vyvolať prekreslenie vlastného View v Android?
sobes.tech AI
Odpoveď od AI
Existuje niekoľko spôsobov, ako vyvolať prekreslenie (invalidate) vlastného View:
-
invalidate():
- Prekreslí celý View.
- Plánuje volanie
onDraw(). - Používa sa na jednoduché prekreslenie bez určenia konkrétnej oblasti.
// Vo vašom View alebo pri interakcii s ním myCustomView.invalidate() -
invalidate(Rect dirty) alebo invalidate(int left, int top, int right, int bottom):
- Prekreslí iba určenú oblasť View.
- Je to efektívnejšie, ak zmeny ovplyvňujú iba časť View.
// Prekresliť oblasť s súradnicami (10, 20) po (100, 150) myCustomView.invalidate(10, 20, 100, 150) // Alebo pomocou Rect val dirtyRect = Rect(10, 20, 100, 150) myCustomView.invalidate(dirtyRect) -
postInvalidate():
- Bezpečné na volanie z akéhokoľvek vlákna, vrátane pozadí.
- Umiestňuje operáciu
invalidate()do fronty správ na vykonanie na UI vlákne.
// Volanie z pozadí vlákna Thread { // Vykonávame dlhé výpočty // ... myCustomView.postInvalidate() }.start()
Porovnanie invalidate() a postInvalidate():
| Metóda | Vlákno vykonávania | Bezpečnosť z pozadia vlákna | Účel |
|---|---|---|---|
invalidate() |
UI vlákno | Nie | Okamžité prekreslenie (ak je to možné na UI vlákne) |
postInvalidate() |
UI vlákno | Áno | Odložené prekreslenie vložením do fronty správ |
Väzba s onDraw():
Volanie akéhokoľvek z metód invalidate(...) plánuje vykonanie metódy onDraw() vášho View. Android systém spája niekoľko požiadaviek na invalidate do jednej, ak je to možné, pre optimalizáciu výkonu. onDraw() sa volá iba vtedy, keď je systém pripravený na prekreslenie.
Kedy použiť každú metódu:
- Použite
invalidate(), keď ste na UI vlákne (napríklad v obsluhe kliknutia, po animácii) a zmeny ovplyvňujú celý View alebo vám nezáleží na optimalizácii podľa oblasti. - Použite
invalidate(Rect)aleboinvalidate(int, int, int, int)pre optimalizáciu, ak zmeny ovplyvňujú iba časť View a ste na UI vlákne. - Použite
postInvalidate(), keď potrebujete volať invalidate z pozadínového vlákna. - Nevolajte
invalidate()alebopostInvalidate()príliš často bez potreby, pretože to môže negatívne ovplyvniť výkon. Volajte ich iba po zmene dát alebo stavu View, ktoré vyžadujú vizuálnu aktualizáciu.