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(...) մեթոդի կանչը պլանավորում է onDraw()-ի կատարմամբ ձեր View-ի։ Android համակարգը միավորում է մի քանի invalidate-ների պահանջները մեկում՝ արդյունավետության համար։ onDraw() կանչվում է միայն այն ժամանակ, երբ համակարգը պատրաստ է վերանորոգման:
Երբ օգտագործել յուրաքանչյուր մեթոդը:
- Օգտագործեք
invalidate(), երբ գտնվում եք UI թելին (օրինակ՝ կլիկի handler-ում, հետո անիմացիայի) և փոփոխությունները վերաբերում են ամբողջ View-ին կամ ձեզ չի հետաքրքրում տարածքի օպտիմալացումը: - Օգտագործեք
invalidate(Rect)կամinvalidate(int, int, int, int)օպտիմալացման համար, եթե փոփոխությունները վերաբերում են միայն մասի View-ին և գտնվում եք UI թելին: - Օգտագործեք
postInvalidate(), երբ անհրաժեշտ է կանչել invalidate ֆոնային թելից: - Չպետք է շատ հաճախ կանչել
invalidate()կամpostInvalidate()առանց անհրաժեշտության, քանի որ դա կարող է բացասաբար ազդել կատարողականության վրա։ Կանչեք դրանք միայն այն ժամանակ, երբ տվյալները կամ վիճակը փոխվում են և դա պահանջում է տեսողական թարմացում։