Sobes.tech
Junior

Kako pozvati ponovno crtanje prilagođenog View u Androidu?

sobes.tech АИ

Одговор од АИ

Postoji nekoliko načina za pozivanje ponovnog crtanja (invalidate) prilagođenog View:

  1. 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()
    
  2. 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)
    
  3. 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) ili invalidate(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() ili postInvalidate() 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.