Junior
Androidda maxsus View-ni qayta chizishni qanday chaqirish mumkin?
sobes.tech AI
AIdan javob
Nihoyat, maxsus View-ni yangilash (invalidate) uchun bir nechta usullar mavjud:
-
invalidate():
- Butun View-ni qayta chizadi.
onDraw()chaqirilishini rejalashtiradi.- Muayyan sohani ko'rsatmasdan oddiy qayta chizish uchun ishlatiladi.
// Sizning View ichida yoki unga ta'sir qilganda myCustomView.invalidate() -
invalidate(Rect dirty) yoki invalidate(int left, int top, int right, int bottom):
- Faqat belgilangan sohani qayta chizadi.
- Agar o'zgarishlar faqat Viewning bir qismini qamrab olsa, yanada samarali.
// Koordinatalar bilan (10, 20) dan (100, 150) gacha bo'lgan sohani qayta chizish myCustomView.invalidate(10, 20, 100, 150) // Yoki Rect yordamida val dirtyRect = Rect(10, 20, 100, 150) myCustomView.invalidate(dirtyRect) -
postInvalidate():
- Har qanday oqimdan, jumladan fon oqimlaridan chaqirish xavfsiz.
invalidate()operatsiyasini UI oqimida bajarish uchun xabarlar navbatiga qo'shadi.
// Fon oqimidan chaqirish Thread { // Uzun hisob-kitoblarni bajarish // ... myCustomView.postInvalidate() }.start()
invalidate() va postInvalidate() taqqoslash:
| Usul | Ishlash oqimi | Fon oqimidan xavfsizlik | Maqsad |
|---|---|---|---|
invalidate() |
UI oqimi | Yo'q | Darhol qayta chizish (UI oqimida imkon qadar) |
postInvalidate() |
UI oqimi | Ha | Xabarlar navbatida kechiktirilgan qayta chizish |
onDraw() bilan bog'liqlik:
Har qanday invalidate(...) metodini chaqirish, sizning View'ingizning onDraw() metodining bajarilishini rejalashtiradi. Android tizimi, imkon boricha, bir nechta invalidatsiya so'rovlarini bitta qilish uchun, ishlash samaradorligini oshirish maqsadida, birlashtiradi. onDraw() faqat tizim qayta chizishga tayyor bo'lsa chaqiriladi.
Har bir metodni qachon ishlatish kerak:
invalidate()ni UI oqimida ishlating (masalan, klikni boshqaruvchi, animatsiyadan keyin) va o'zgarishlar butun View'ni qamrab olganda yoki hudud optimallashtirishga ahamiyat bermasangiz.invalidate(Rect)yokiinvalidate(int, int, int, int)ni optimallashtirish uchun ishlating, agar o'zgarishlar faqat Viewning bir qismini qamrab olsa va siz UI oqimidasiz.postInvalidate()ni fon oqimidan invalidate chaqirishingiz kerak bo'lsa ishlating.invalidate()yokipostInvalidate()ni juda tez-tez chaqirmang, chunki bu ishlashga salbiy ta'sir qilishi mumkin. Faqat ma'lumotlar yoki View holatidagi o'zgarishlar vizual yangilanishni talab qilganda chaqiring.