Sobes.tech
Junior

Kaip iškviesti individualizuoto View perpiešimą Android?

sobes.tech AI

Atsakymas iš AI

Yra keletas būdų iškviesti perpiešimą (invalidate) pritaikytam View:

  1. invalidate():

    • Perpiešia visą View.
    • Planuoja onDraw() iškvietimą.
    • Naudojama paprastam perpiešimui be konkrečios srities nurodymo.
    // Jūsų View viduje arba sąveikoje su juo
    myCustomView.invalidate()
    
  2. invalidate(Rect dirty) arba invalidate(int left, int top, int right, int bottom):

    • Perpiešia tik nurodytą View sritį.
    • Efektyviau, jei pakeitimai liečia tik dalį View.
    // Perpiešti sritį su koordinatėmis (10, 20) iki (100, 150)
    myCustomView.invalidate(10, 20, 100, 150)
    
    // Arba naudojant Rect
    val dirtyRect = Rect(10, 20, 100, 150)
    myCustomView.invalidate(dirtyRect)
    
  3. postInvalidate():

    • Saugu iškviesti iš bet kurios gijos, įskaitant fonines.
    • Pateikia invalidate() operaciją į žinučių eilę UI gijoje vykdymui.
    // Iš foninės gijos iškvietimas
    Thread {
        // Ilgalaikiai skaičiavimai
        // ...
        myCustomView.postInvalidate()
    }.start()
    

Invalidate() ir postInvalidate() palyginimas:

Metodas Vykdymo gija Saugu iš foninės gijos Paskirtis
invalidate() UI gija Ne Nedelsiant perpiešti (kiek įmanoma UI gijoje)
postInvalidate() UI gija Taip Atidėtas perpiešimas, įdedant į žinučių eilę

Ryšys su onDraw():

Kiekvienas invalidate(...) metodas planuoja onDraw() vykdymą jūsų View. Android sistema sujungia kelis invalidate užklausimus į vieną, jei įmanoma, optimizacijos tikslais. onDraw() iškviečiamas tik tada, kai sistema yra pasiruošusi perpiešti.

Kada naudoti kiekvieną metodą:

  • Naudokite invalidate(), kai esate UI gijoje (pavyzdžiui, paspaudimo apdorojimo metu, po animacijos) ir pakeitimai liečia visą View arba jums nesvarbi srities optimizacija.
  • Naudokite invalidate(Rect) arba invalidate(int, int, int, int) optimizacijai, jei pakeitimai liečia tik dalį View ir esate UI gijoje.
  • Naudokite postInvalidate(), kai reikia iškviesti invalidate iš foninės gijos.
  • Nenaudokite per dažnai invalidate() ar postInvalidate() be reikalo, nes tai gali neigiamai paveikti našumą. Juos iškvieskite tik po duomenų ar būsenos pakeitimo, kurie reikalauja vizualinio atnaujinimo.