Sobes.tech
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:

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