Junior
Πώς καλείτε την ανανέωση μιας προσαρμοσμένης προβολής στο 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(), քանի որ դա կարող է բացասաբար ազդել կատարողականության վրա: Կանչեք դրանք միայն այն ժամանակ, երբ տվյալների կամ View-ի վիճակի փոփոխությունները պահանջում են տեսողական թարմացում։