Welke methoden bestaan er om een View opnieuw te tekenen in Android?
sobes.tech AI
Antwoord van AI
Er zijn verschillende hoofdmethoden om het opnieuw tekenen van een View in Android te beheren:
-
invalidate(): Deze methode markeert de huidige View en al zijn kind-Views als "vuil", wat een opnieuw tekenen vereist. Het systeem plant een tekenpass in de toekomst (meestal in de volgende frame). Wordt gebruikt wanneer iets dat het uiterlijk van de View beïnvloedt (bijvoorbeeld kleur, tekst) is veranderd. Kan vanuit elke thread worden aangeroepen. -
postInvalidate(): Vergelijkbaar metinvalidate(), maar bedoeld om vanuit achtergrondthreads te worden aangeroepen. Het stuurt een bericht naar de hoofd-UI-thread ominvalidate()uit te voeren. -
requestLayout(): Deze methode geeft aan dat de View haar grootte en positie opnieuw moet berekenen. Het activeert een meet- en lay-outpass na het opnieuw tekenen. Wordt gebruikt wanneer iets dat de grootte of lay-out van de View beïnvloedt is veranderd (bijvoorbeeld, toevoegen/verwijderen van kind-elementen, wijzigen van padding). Alleen vanaf de hoofd-UI-thread aanroepen.
Als zowel het uiterlijk als de grootte/positie van de View zijn veranderd, is het vaak voldoende om requestLayout() aan te roepen, omdat het meestal invalidate() aanroept in het proces. Een directe wijziging alleen in het uiterlijk vereist alleen invalidate().
Voorbeeld van gebruik van invalidate():
// Verander de kleur van de View in de hoofd-thread
myView.setBackgroundColor(Color.parseColor("#FF0000"));
myView.invalidate();
Voorbeeld van gebruik van postInvalidate() vanuit een achtergrondthread:
new Thread(new Runnable() {
@Override
public void run() {
// Verander de tekst van de View in een achtergrondthread
myView.setText("Nieuwe tekst");
myView.postInvalidate(); // Opnieuw tekenen via de hoofd-thread
}
}).start();
Voorbeeld van gebruik van requestLayout():
// Verander padding van de View en vraag om herindeling in de hoofd-thread
myView.setPadding(10, 10, 10, 10);
myView.requestLayout();
Het is belangrijk om de levenscyclus van het tekenen van een View te begrijpen:
- Wijziging van gegevens (bijvoorbeeld kleur, tekst, grootte).
- Aanroep van
invalidate()ofrequestLayout(). - Planning van opnieuw tekenen door het systeem.
- Meetfase (
measure pass) - aanroep vanonMeasure(). - Lay-outfase (
layout pass) - aanroep vanonLayout(). - Tekstfase (
draw pass) - aanroep vanonDraw().
De methode invalidate() start stap 6, terwijl requestLayout() stappen 4, 5 en 6 start.