Sobes.tech
Junior

Hogyan hívható elő a testreszabott View újrarajzolása Androidban?

sobes.tech MI

Válasz az MI-től

Számos módja van egy egyedi View újrarajzolásának (invalidate):

  1. invalidate():

    • Az egész View újrarajzolása.
    • Az onDraw() hívásának ütemezése.
    • Egyszerű újrarajzolásra használható anélkül, hogy konkrét területet adna meg.
    // A View-on belül vagy vele való interakció során
    myCustomView.invalidate()
    
  2. invalidate(Rect dirty) vagy invalidate(int left, int top, int right, int bottom):

    • Csak a megadott terület újrarajzolása a View-n.
    • Hatékonyabb, ha a változások csak a View egy részét érintik.
    // A terület újrarajzolása koordinátákkal (10, 20) -tól (100, 150)-ig
    myCustomView.invalidate(10, 20, 100, 150)
    
    // Vagy Rect segítségével
    val dirtyRect = Rect(10, 20, 100, 150)
    myCustomView.invalidate(dirtyRect)
    
  3. postInvalidate():

    • Biztonságos hívni bármely szálból, beleértve a háttérszálakat is.
    • Az invalidate() műveletet az üzenetsorba helyezi, hogy a UI szálon hajtsa végre.
    // Háttérszálból
    Thread {
        // Hosszú számítások végrehajtása
        // ...
        myCustomView.postInvalidate()
    }.start()
    

Az invalidate() és postInvalidate() összehasonlítása:

Módszer Végrehajtási szál Biztonság háttérszálról Célja
invalidate() UI szál Nem Azonnali újrarajzolás (amennyire csak lehet a UI szálon)
postInvalidate() UI szál Igen Késleltetett újrarajzolás üzenetsor segítségével

Kapcsolat az onDraw()-val:

Bármely invalidate(...) metódus hívása tervezi a View onDraw() metódusának végrehajtását. Az Android rendszer több invalidációs kérészt egyesít, ha lehetséges, a teljesítmény optimalizálása érdekében. Az onDraw() csak akkor hívódik meg, amikor a rendszer készen áll az újra rajzolásra.

Mikor használja minden módszert:

  • Használja az invalidate(), amikor a UI szálon van (például kattintáskezelőben, animáció után), és a változások az egész View-t érintik, vagy nem fontos az optimalizálás a terület szerint.
  • Használja az invalidate(Rect) vagy invalidate(int, int, int, int)-t az optimalizáció érdekében, ha a változások csak a View egy részét érintik, és UI szálon van.
  • Használja a postInvalidate()-t, ha invalidate-et kell hívni háttérszálról.
  • Ne hívja túl gyakran az invalidate() vagy postInvalidate()-t, mivel ez ronthatja a teljesítményt. Csak akkor hívja őket, ha az adatok vagy a View állapotának változása vizuális frissítést igényel.