Sobes.tech
Junior

Hoe roep je het opnieuw tekenen van een aangepaste View in Android op?

sobes.tech AI

Antwoord van AI

Er zijn verschillende manieren om een aangepaste View te verversen (invalidate):

  1. invalidate():

    • Tekent de hele View opnieuw.
    • Plant de aanroep van onDraw().
    • Gebruikt voor eenvoudige hertekening zonder een specifiek gebied aan te geven.
    // Binnen je View of bij interactie ermee
    myCustomView.invalidate()
    
  2. invalidate(Rect dirty) of invalidate(int left, int top, int right, int bottom):

    • Tekent alleen het aangegeven gebied van de View opnieuw.
    • Is efficiënter als de wijzigingen slechts een deel van de View betreffen.
    // Hertekenen van het gebied met coördinaten (10, 20) tot (100, 150)
    myCustomView.invalidate(10, 20, 100, 150)
    
    // Of met Rect
    val dirtyRect = Rect(10, 20, 100, 150)
    myCustomView.invalidate(dirtyRect)
    
  3. postInvalidate():

    • Is veilig om vanaf elk thread aan te roepen, inclusief achtergrondthreads.
    • Plaatst de operatie invalidate() in de berichtwachtrij voor uitvoering op de UI-thread.
    // Vanaf een achtergrondthread
    Thread {
        // Voer lange berekeningen uit
        // ...
        myCustomView.postInvalidate()
    }.start()
    

Vergelijking tussen invalidate() en postInvalidate():

Methode Uitvoeringsdraad Veilig vanaf achtergrondthread Doel
invalidate() UI-draad Nee Directe hertekening (zo veel mogelijk op de UI-draad)
postInvalidate() UI-draad Ja Uitgestelde hertekening via berichtwachtrij

Relatie met onDraw():

Het aanroepen van een van de methoden invalidate(...) plant de uitvoering van de onDraw()-methode van je View. Het Android-systeem combineert meerdere invalidate-verzoeken indien mogelijk in één, om de prestaties te optimaliseren. onDraw() wordt alleen aangeroepen wanneer het systeem klaar is om opnieuw te tekenen.

Wanneer elke methode te gebruiken:

  • Gebruik invalidate() wanneer je in de UI-draad bent (bijvoorbeeld in een klik-handler, na een animatie) en wijzigingen de hele View betreffen of je niet om optimalisatie per gebied geeft.
  • Gebruik invalidate(Rect) of invalidate(int, int, int, int) voor optimalisatie als de wijzigingen slechts een deel van de View betreffen en je in de UI-draad bent.
  • Gebruik postInvalidate() wanneer je invalidate vanuit een achtergrondthread moet aanroepen.
  • Roep invalidate() of postInvalidate() niet te vaak aan zonder reden, omdat dit de prestaties negatief kan beïnvloeden. Roep ze alleen aan na wijzigingen in gegevens of toestand van de View die een visuele update vereisen.