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):
-
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() -
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) -
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)vagyinvalidate(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()vagypostInvalidate()-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.