Junior
როგორ გამოიძახოთ პერსონალიზებული View-ის გადახედვა Android-ში?
sobes.tech AI
პასუხი AI-სგან
არსებობს რამდენიმე გზა, როგორ გამოიწვიოთ პერსონალიზებული View-ის გადახედვა (invalidate):
-
invalidate():
- მთლიან View-ს გადახედავს.
- გეგმავს
onDraw()-ის გამოძახებას. - გამოიყენება მარტივი გადახედვისთვის, კონკრეტული ზონის მითითების გარეშე.
// თქვენს View-ის შიგნით ან მასთან ურთიერთობის დროს myCustomView.invalidate() -
invalidate(Rect dirty) ან invalidate(int left, int top, int right, int bottom):
- მხოლოდ მითითებულ ზონას გადახედავს View-ში.
- უფრო ეფექტურია, თუ ცვლილებები ეხება მხოლოდ ნაწილს View-ის.
// ზონის გადახედვა კოორდინატებით (10, 20) დან (100, 150) myCustomView.invalidate(10, 20, 100, 150) // ან Rect-ის გამოყენებით val dirtyRect = Rect(10, 20, 100, 150) myCustomView.invalidate(dirtyRect) -
postInvalidate():
- უსაფრთხოა ნებისმიერ ნაკადიდან, მათ შორის ფონიდან.
- აყენებს
invalidate()-ს შეტყობინებების რიგში UI ნაკადზე შესრულებისთვის.
// ფონური ნაკადიდან გამოძახება Thread { // გრძელვადიანი გამოთვლების შესრულება // ... myCustomView.postInvalidate() }.start()
შედარება invalidate() და postInvalidate():
| მეთოდი | შესრულების ნაკადი | ფონური ნაკადიდან უსაფრთხოება | დანიშნულება |
|---|---|---|---|
invalidate() |
UI ნაკადი | არა | დაუყოვნებლივ გადახედვა (რაც შესაძლებელია UI-ში) |
postInvalidate() |
UI ნაკადი | კი | გადახედვის დაგვიანება შეტყობინებების რიგში |
onDraw()-თან კავშირი:
ნებისმიერი invalidate(...) მეთოდის გამოძახება გეგმავს თქვენს View-ის onDraw()-ის შესრულებას. Android სისტემა აერთიანებს რამდენიმე invalidate მოთხოვნას ერთში, თუ ეს შესაძლებელია, შესრულების ოპტიმიზაციისთვის. onDraw() იძახება მხოლოდ მაშინ, როდესაც სისტემა მზადაა გადახედვისთვის.
როდის გამოიყენოთ თითოეული მეთოდი:
- გამოიყენეთ
invalidate(), როდესაც თქვენ UI-ზედ ხართ (მაგალითად, კლიკის handler-ში, ანიმაციის შემდეგ) და ცვლილებები ეხება მთელ View-ს ან არ გსურთ ზონური ოპტიმიზაცია. - გამოიყენეთ
invalidate(Rect)ანinvalidate(int, int, int, int)ოპტიმიზაციისთვის, თუ ცვლილებები ეხება მხოლოდ ნაწილს View-ის და ხართ UI-ზედ. - გამოიყენეთ
postInvalidate(), როდესაც გსურთinvalidate()-ს გამოძახება ფონური ნაკადიდან. - არ იჩქაროთ ხშირად
invalidate()ანpostInvalidate()-ს გამოძახება, რადგან ეს შეიძლება ნეგატიურად იმოქმედოს შესრულებაზე. გამოიძახეთ ისინი მხოლოდ მაშინ, როდესაც მონაცემები ან მდგომარეობა შეიცვალა და ეს ვიზუალური განახლება მოითხოვს.