Sobes.tech
Junior

Android-də xüsusi View-in yenidən çəkilməsini necə çağırmaq olar?

sobes.tech Süni İntellekt

AI-dan cavab

Xüsusi View-in yenilənməsi (invalidate) üçün bir neçə üsul mövcuddur:

  1. invalidate():

    • Bütün View-i yenidən çəkir.
    • onDraw() çağırışını planlaşdırır.
    • Konkret sahə göstərmədən sadə yenidən çəkilmə üçün istifadə olunur.
    // View-inizin içində və ya onunla qarşılıqlı əlaqədə
    myCustomView.invalidate()
    
  2. invalidate(Rect dirty) və ya invalidate(int left, int top, int right, int bottom):

    • Yalnız göstərilən sahəni yenidən çəkir.
    • Əgər dəyişikliklər yalnız View-in bir hissəsini əhatə edirsə, daha səmərəlidir.
    // Koordinatları (10, 20) ilə (100, 150) olan sahəni yenidən çək
    myCustomView.invalidate(10, 20, 100, 150)
    
    // və ya Rect istifadə edərək
    val dirtyRect = Rect(10, 20, 100, 150)
    myCustomView.invalidate(dirtyRect)
    
  3. postInvalidate():

    • Hər hansı bir axınla, o cümlədən fon axınlarından çağırıla bilər.
    • invalidate() əməliyyatını UI axınında yerinə yetirmək üçün mesajlar növbəsinə yerləşdirir.
    // Fon axınından
    Thread {
        // Uzun hesablama apar
        // ...
        myCustomView.postInvalidate()
    }.start()
    

invalidate() və postInvalidate() müqayisəsi:

Metod İcra axını Fon axınından təhlükəsizlik Məqsəd
invalidate() UI axını Yox Dərhal yenidən çəkilmə (mümkün qədər UI axınında)
postInvalidate() UI axını Bəli Gecikdirilmiş yenidən çəkilmə mesajlar növbəsi vasitəsilə

onDraw() ilə əlaqəsi:

Hər hansı invalidate(...) metodunun çağırılması, View-inizin onDraw() metodunun icrasını planlaşdırır. Android sistemi, performansı optimallaşdırmaq üçün mümkün olduqda, bir neçə invalidasiya tələblərini birləşdirir. onDraw() yalnız sistem yenidən çəkilməyə hazır olduqda çağrılır.

Hər bir metoddan nə zaman istifadə etmək:

  • invalidate() istifadə edin, UI axınında olarkən (məsələn, klik hadisəsi işləyicisində, animasiya sonrası) və dəyişikliklər bütün View-ə aiddirsə və ya sahə optimizasiyasına ehtiyac yoxdursa.
  • invalidate(Rect) və ya invalidate(int, int, int, int) istifadə edin, əgər dəyişikliklər yalnız View-in bir hissəsini əhatə edirsə və UI axınında olursunuzsa.
  • postInvalidate() istifadə edin, əgər invalidate-i fon axınından çağırmalısınızsa.
  • invalidate() və ya postInvalidate()-u çox tez-tez çağırmayın, çünki bu performansa mənfi təsir göstərə bilər. Yalnız məlumatlar və ya View-in vəziyyətində dəyişikliklər vizual yeniləmə tələb edirsə çağırın.