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):
-
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() -
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) -
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)ofinvalidate(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()ofpostInvalidate()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.