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:
-
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() -
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) -
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ə yainvalidate(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ə yapostInvalidate()-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.