Sobes.tech
Junior

Πώς καλείτε την ανανέωση μιας προσαρμοσμένης προβολής στο Android;

sobes.tech AI

Απάντηση από AI

Կան մի քանի եղանակներ՝ հարմարեցված View- ի վերականգնում (invalidate) անելու համար:

  1. invalidate():

    • Փոխում է ամբողջ View- ը:
    • Պլանավորում է onDraw()-ի կանչը:
    • Օգտագործվում է պարզ վերականգնում առանց կոնկրետ տարածք նշելու:
    // Ձեր View-ի ներսում կամ նրա հետ փոխազդեցության ժամանակ
    myCustomView.invalidate()
    
  2. 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)
    
  3. 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-ի վիճակի փոփոխությունները պահանջում են տեսողական թարմացում։