Junior
Kako pozvati ponovno crtanje prilagođenog View u Androidu?
sobes.tech АИ
Одговор од АИ
Postoji nekoliko načina za pozivanje ponovnog crtanja (invalidate) prilagođenog View:
-
invalidate():
- Crta ceo View.
- Planira poziv
onDraw(). - Koristi se za jednostavno ponovno crtanje bez specificiranja oblasti.
// Unutar vašeg View ili pri interakciji s njim myCustomView.invalidate() -
invalidate(Rect dirty) ili invalidate(int left, int top, int right, int bottom):
- Crta samo navedenu oblast View.
- Efikasnije je ako promene utiču samo na deo View.
// Precrtavanje oblasti sa koordinatama (10, 20) do (100, 150) myCustomView.invalidate(10, 20, 100, 150) // Ili pomoću Rect val dirtyRect = Rect(10, 20, 100, 150) myCustomView.invalidate(dirtyRect) -
postInvalidate():
- Sigurno za pozivanje iz bilo kog niti, uključujući pozadinske.
- Stavlja operaciju
invalidate()u red poruka za izvršenje na UI niti.
// Pozivanje iz pozadinske niti Thread { // Izvršavamo duge proračune // ... myCustomView.postInvalidate() }.start()
Poređenje invalidate() i postInvalidate():
| Metod | Nit izvršenja | Bezbednost iz pozadinske niti | Namenjeno za |
|---|---|---|---|
invalidate() |
UI nit | Ne | Neposredno ponovno crtanje (koliko je moguće u UI niti) |
postInvalidate() |
UI nit | Da | Odloženo ponovno crtanje stavljanjem u red poruka |
Veza sa onDraw():
Pozivanje bilo koje od metoda invalidate(...) planira izvršenje metode onDraw() vašeg View-a. Android sistem kombinuje više zahteva za invalidate u jedan, ako je moguće, radi optimizacije performansi. onDraw() se poziva samo kada je sistem spreman za ponovno crtanje.
Kada koristiti svaku metodu:
- Koristite
invalidate(), kada ste na UI niti (npr. u obradi klika, nakon animacije) i promene utiču na ceo View ili vam nije važna optimizacija po oblasti. - Koristite
invalidate(Rect)iliinvalidate(int, int, int, int)za optimizaciju, ako promene utiču samo na deo View i nalazite se na UI niti. - Koristite
postInvalidate(), kada vam je potrebno da pozovete invalidate iz pozadinskog niti. - Nemojte prečesto pozivati
invalidate()ilipostInvalidate()bez potrebe, jer to može negativno uticati na performanse. Pozivajte ih samo nakon promene podataka ili stanja View-a koje zahtevaju vizuelno ažuriranje.