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

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