Sobes.tech
Junior

Kuidas kutsuda Androidis välja kohandatud vaate uuesti joonistamine?

sobes.tech AI

Vastus AI-lt

On mitu viisi, kuidas kutsuda välja kohandatud View'i uuesti joonistamine (invalidate):

  1. invalidate():

    • Joonistab kogu View'i uuesti.
    • Plaanitakse onDraw() kutsumine.
    • Kasutatakse lihtsaks uuesti joonistamiseks ilma konkreetse piirkonna määramiseta.
    // Oma View'i sees või sellega suhtlemisel
    myCustomView.invalidate()
    
  2. invalidate(Rect dirty) või invalidate(int left, int top, int right, int bottom):

    • Joonistab ainult määratud View'i piirkonna.
    • Efektiivsem, kui muudatused mõjutavad ainult osa View'ist.
    // Joonistada piirkonda koordinaatidega (10, 20) kuni (100, 150)
    myCustomView.invalidate(10, 20, 100, 150)
    
    // Või Rect abil
    val dirtyRect = Rect(10, 20, 100, 150)
    myCustomView.invalidate(dirtyRect)
    
  3. postInvalidate():

    • Ohutu kutsuda mistahes niidist, kaasa arvatud taustaniidist.
    • Paneb invalidate() toimingu sõnumijärjekorda UI-niidil täitmiseks.
    // Kutsutud taustaniidist
    Thread {
        // Pikkade arvutuste tegemine
        // ...
        myCustomView.postInvalidate()
    }.start()
    

Võrdlus invalidate() ja postInvalidate():

Meetod Täitmise niit Ohutus taustaniidist Eesmärk
invalidate() UI niit Ei Koheselt uuesti joonistamine (nii palju kui võimalik UI-niidil)
postInvalidate() UI niit Jah Viivitusega uuesti joonistamine, asetades selle sõnumijärjekorda

Seos onDraw():ga:

Iga invalidate(...) meetodi väljakutse plaanib teie View'i onDraw() täitmise. Android süsteem ühendab mitu invalidate nõuet ühte, kui see on võimalik, jõudluse optimeerimiseks. onDraw() kutsutakse välja ainult siis, kui süsteem on valmis uuesti joonistama.

Millal kasutada iga meetodit:

  • Kasutage invalidate(), kui olete UI-niidil (näiteks kliki töötleja, pärast animatsiooni) ja muudatused mõjutavad kogu View'i või teile ei ole oluline piirkonna optimeerimine.
  • Kasutage invalidate(Rect) või invalidate(int, int, int, int) optimeerimiseks, kui muudatused mõjutavad ainult osa View'ist ja olete UI-niidil.
  • Kasutage postInvalidate(), kui peate kutsuma invalidate taustaniidist.
  • Ärge kutsuge invalidate() või postInvalidate() liiga sageli ilma vajaduseta, kuna see võib negatiivselt mõjutada jõudlust. Kutsuge neid ainult pärast andmete või oleku muutmist, mis nõuavad visuaalset uuendust.