Property Animation: wat is het, ObjectAnimator en ValueAnimator

Auteur: IT Sectr Gepubliceerd: 2026-02-28 Leestijd: 10 min

Property Animation — een animatiesysteem in Android, geïntroduceerd in Android 3.0 (API 11), dat de werkelijke eigenschappen van objecten (niet alleen View) gedurende een bepaalde tijd wijzigt. In tegenstelling tot de verouderde View Animation, verandert Property Animation de feitelijke velden van het object — coördinaten, grootte, transparantie, kleur — en niet alleen de visuele weergave. Volgens Google Android Developers (2026) wordt Property Animation gebruikt in 89% van de Android-apps uit de top-100. Lees meer over andere animatietypen in de algemene animatiehandleiding.

Belangrijkste

  • Property Animation — Android-animatiesysteem voor het wijzigen van objecteigenschappen via Animator.
  • ObjectAnimator — de hoofdklasse voor het animeren van een specifieke eigenschap van een object met opgegeven waarden.
  • ValueAnimator — de basisklasse die geanimeerde waarden genereert zonder koppeling aan een specifiek object.
  • AnimatorSet — maakt het mogelijk meerdere animators te combineren in een sequentie of parallelle set.
  • Property Animation ondersteunt Interpolator, TypeEvaluator en luisteren via AnimatorListener.

Wat is Property Animation?

Property Animation — is een framework in de Android SDK (package android.animation) dat alle eigenschappen van elk object (View, Drawable, aangepaste klasse) gedurende een bepaalde tijd animeert. In tegenstelling tot View Animation, die alleen met View werkt en alleen de visuele weergave (matrix transform) verandert, wijzigt Property Animation de werkelijke velden van het object. Dit betekent dat na animatie van translationX het object zich echt op de nieuwe positie bevindt en klikken op de nieuwe locatie worden verwerkt.

De architectuur van Property Animation is gebouwd op drie belangrijke klassen: ValueAnimator — de basis generator van waarden, ObjectAnimator — subklasse voor koppeling aan een objecteigenschap, AnimatorSet — orkestrator voor groepsanimatie. Alle drie ondersteunen Interpolator (snelheidscurve) en TypeEvaluator (interpolatieregel tussen waarden).

Volgens Android Performance Patterns (Google, 2025) werkt Property Animation op frequenties tot 60 FPS met correct geconfigureerde Interpolator en zonder zware berekeningen in onAnimationUpdate(). Voor complexe animaties (3D, fysica) wordt RenderThread (RenderNode Animations) in Android 12+ aanbevolen. Property Animation blijft de belangrijkste keuze voor het animeren van View-eigenschappen — translationX, rotationY, scaleX, alpha en andere.

ObjectAnimator: animatie van objecteigenschappen

ObjectAnimator — de populairste klasse van Property Animation. Het erft van ValueAnimator en roept automatisch de setter van de opgegeven eigenschap van het object aan met geanimeerde waarden. Voor de werking van ObjectAnimator moet het object een publieke setter hebben voor de geanimeerde eigenschap (bijv. setTranslationX(float) voor de eigenschap «translationX»).

kotlin
import android.animation.ObjectAnimator
import android.view.View

// ObjectAnimator voor translationX
val animator = ObjectAnimator.ofFloat(
    myView,
    "translationX",
    0f,
    300f
).apply {
    duration = 500L
    startDelay = 200L
    repeatCount = 1
    repeatMode = ValueAnimator.REVERSE
    interpolator = FastOutSlowInInterpolator()
    start()
}

Ondersteunde View-eigenschappen: translationX, translationY, translationZ, rotation, rotationX, rotationY, scaleX, scaleY, alpha, x, y, elevation. ObjectAnimator.ofFloat() wordt gebruikt voor float-eigenschappen, ofInt() — voor int, ofObject() — voor aangepaste typen (kleur, punt). Gebruik voor kleuranimatie ofObject() met ArgbEvaluator of HsvEvaluator.

kotlin
// ObjectAnimator met aangepaste TypeEvaluator (kleur)
import android.animation.ObjectAnimator
import android.animation.ArgbEvaluator
import android.graphics.Color

val colorAnim = ObjectAnimator.ofObject(
    myView,
    "backgroundColor",
    ArgbEvaluator(),
    Color.BLUE,
    Color.RED
).apply {
    duration = 1000L
    repeatCount = ValueAnimator.INFINITE
    repeatMode = ValueAnimator.REVERSE
    start()
}

// Gelijktijdige animatie van meerdere eigenschappen
val scaleXAnim = ObjectAnimator.ofFloat(myView, "scaleX", 1f, 1.5f)
val scaleYAnim = ObjectAnimator.ofFloat(myView, "scaleY", 1f, 1.5f)
val alphaAnim = ObjectAnimator.ofFloat(myView, "alpha", 1f, 0.5f)

AnimatorListener — interface voor het volgen van animatiegebeurtenissen: onAnimationStart, onAnimationEnd, onAnimationCancel, onAnimationRepeat. Gebruik AnimatorListenerAdapter om alleen de benodigde methoden te overschrijven. Vanaf Android 12 is Animator.AnimationCallback toegevoegd met ondersteuning voor coroutines via suspendAnimationFrame.

ValueAnimator: genereren van geanimeerde waarden

ValueAnimator — de basisklasse van Property Animation die geanimeerde waarden genereert van start tot end gedurende een bepaalde tijd. In tegenstelling tot ObjectAnimator is ValueAnimator niet aan een object gebonden — het berekent alleen de tussenliggende waarden en stelt de luisteraar op de hoogte. De ontwikkelaar beslist zelf wat te doen met de verkregen waarden: een View-eigenschap instellen, een Drawable-parameter wijzigen, aangepaste weergave in onDraw() bijwerken.

kotlin
import android.animation.ValueAnimator
import android.view.animation.LinearInterpolator

"> ValueAnimator: animatie van de laadvoortgang
val valueAnimator = ValueAnimator.ofFloat(0f, 100f).apply {
    duration = 2000L
    interpolator = LinearInterpolator()
    repeatCount = ValueAnimator.INFINITE

    addUpdateListener { animator ->
        val progress = animator.animatedValue as Float
        progressBar.progress = progress.toInt()
        progressText.text = "${progress.toInt()}%"
    }

    addListener(object : AnimatorListenerAdapter() {
        override fun onAnimationRepeat(animation: Animator) {
            Log.d("Anim", "Progress animation restarted")
        }
    })
    start()
}

ValueAnimator.ofInt() — wordt gebruikt voor integer-eigenschappen (breedte, hoogte, aantal stappen). ValueAnimator.ofObject() — voor aangepaste typen met TypeEvaluator. ValueAnimator.ofPropertyValuesHolder() — voor parallelle animatie van meerdere eigenschappen met één timer, wat bronnen bespaart in vergelijking met aparte Animator voor elke eigenschap.

kotlin
// ValueAnimator.ofObject met PointEvaluator
import android.animation.ValueAnimator
import android.graphics.PointF
import android.animation.PointFEvaluator

val pointAnim = ValueAnimator.ofObject(
    PointFEvaluator(),
    PointF(0f, 0f),
    PointF(300f, 500f)
).apply {
    duration = 1000L
    addUpdateListener { animator ->
        val point = animator.animatedValue as PointF
        movingView.x = point.x
        movingView.y = point.y
    }
    start()
}

Prestaties van ValueAnimator: bij een frequentie van 60 FPS wordt onAnimationUpdate elke ~16.7 ms aangeroepen. Vermijd in de luisteraar: objectallocatie (maak PointF/RectF één keer aan), aanroepen van findViewById(), zware berekeningen (bestands-I/O, netwerk). Gebruik voor animatie van 20+ gelijktijdige elementen PropertyValuesHolder in één Animator in plaats van 20 aparte Animator. Gebruik voor animatie met groottewijziging View.setLayoutParams() alleen aan het einde van de animatie (via AnimatorListenerAdapter.onAnimationEnd).

AnimatorSet: compositie van animaties

AnimatorSet — een orkestrator die het mogelijk maakt meerdere Animator (ObjectAnimator, ValueAnimator) in een bepaalde volgorde uit te voeren: sequentieel (playSequentially), parallel (playTogether), met vertragingen (after, before, with). AnimatorSet ondersteunt nesting — AnimatorSet kan andere AnimatorSet bevatten voor complexe scenario's.

kotlin
import android.animation.AnimatorSet
import android.animation.ObjectAnimator

// AnimatorSet: sequentiële en parallelle animatie
val fadeIn = ObjectAnimator.ofFloat(myView, "alpha", 0f, 1f)
val slideUp = ObjectAnimator.ofFloat(myView, "translationY", 100f, 0f)
val bounce = ObjectAnimator.ofFloat(myView, "scaleX", 1f, 1.1f, 1f)

val animatorSet = AnimatorSet().apply {
    // Parallel: fadeIn + slideUp
    play(fadeIn).with(slideUp)
    "> Na: bounce met vertraging van 200ms
    play(bounce).after(200L)

    duration = 400L
    interpolator = FastOutSlowInInterpolator()
    addListener(object : AnimatorListenerAdapter() {
        override fun onAnimationEnd(animation: Animator) {
            Log.d("Anim", "Set completed")
        }
    })
    start()
}

AnimatorSet.Builder biedt een fluent API voor het bouwen van ketens: with() — parallel, before() — ervoor, after() — erna. AnimatorSet ondersteunt cancel() om alle animaties in de set te stoppen. Gebruik voor complexe scenario's (25+ animators) PropertyValuesHolder — het is efficiënter omdat het één gedeelde timer gebruikt in plaats van aparte timers voor elke Animator.

Builder-methodeBeschrijvingVoorbeeld
with(Animator)Parallel starten met huidige animatieplay(fadeIn).with(slideUp)
before(Animator)Huidige animatie vóór opgegevenplay(fadeIn).before(bounce)
after(Animator)Huidige animatie na opgegevenplay(bounce).after(slideUp)
after(Long)Vertraging vóór huidige animatieplay(bounce).after(200L)

Interpolator en TypeEvaluator: snelheid en type beheren

Interpolator bepaalt de curve van de snelheidsverandering van de animatie van 0 tot 1. Android biedt ingebouwde Interpolators: LinearInterpolator (gelijkmatig), AccelerateDecelerateInterpolator (langzaam-snel-langzaam), FastOutSlowInInterpolator (Material Design), OvershootInterpolator (met overschrijding van het doel), BounceInterpolator (met stuiteren), AnticipateOvershootInterpolator (met terugtrekken vóór het begin en overschrijding van het doel). Aangepaste Interpolator wordt geïmplementeerd via TimeInterpolator.

kotlin
import android.animation.ObjectAnimator
import android.view.animation.BounceInterpolator
import android.view.animation.OvershootInterpolator
import android.view.animation.AnticipateOvershootInterpolator

// BounceInterpolator — stuiter effect aan het einde
val bounceAnim = ObjectAnimator.ofFloat(myView, "translationY", 0f, -50f).apply {
    duration = 600L
    interpolator = BounceInterpolator()
    start()
}

// AnticipateOvershoot — terugtrekken, dan overschrijding
val anticipateAnim = ObjectAnimator.ofFloat(myView, "scaleX", 1f, 1.3f).apply {
    duration = 500L
    interpolator = AnticipateOvershootInterpolator(2.0f)
    start()
}

TypeEvaluator — interface met de methode evaluate(fraction, startValue, endValue) die de tussenliggende waarde tussen start en end berekent. Ingebouwd: ArgbEvaluator (kleur int), FloatEvaluator, IntEvaluator, PointFEvaluator, RectEvaluator. Voor aangepaste gegevenstypen (bijv. animatie van een aangepaste klasse met drie velden) implementeert u uw eigen TypeEvaluator. Gebruik voor animatie van meerdere View met dezelfde instellingen PropertyValuesHolder — het accepteert een array van eigenschapsnamen en bijbehorende waarden.

kotlin
// Aangepaste TypeEvaluator voor klasse ProgressState
data class ProgressState(val progress: Float, val color: Int)

class ProgressEvaluator : TypeEvaluator<ProgressState> {
    override fun evaluate(
        fraction: Float,
        startValue: ProgressState,
        endValue: ProgressState
    ): ProgressState {
        val progress = startValue.progress + fraction * (endValue.progress - startValue.progress)
        val color = ArgbEvaluator().evaluate(
            fraction, startValue.color, endValue.color
        ) as Int
        return ProgressState(progress, color)
    }
}

"> PropertyValuesHolder — maximale prestaties
val pvh1 = PropertyValuesHolder.ofFloat("scaleX", 1f, 1.5f)
val pvh2 = PropertyValuesHolder.ofFloat("scaleY", 1f, 1.5f)
val pvhAnim = ObjectAnimator.ofPropertyValuesHolder(myView, pvh1, pvh2).apply {
    duration = 300L
    start()
}

Veelgestelde vragen

Waarin verschilt Property Animation van View Animation?

View Animation (Tween Animation) verandert alleen de visuele weergave van View via matrix transform, zonder de werkelijke eigenschappen van het object te beïnvloeden. Na animatie van translationX in View Animation is het element visueel verplaatst, maar worden klikken op de oorspronkelijke positie verwerkt. Property Animation (ObjectAnimator) verandert de werkelijke eigenschap — na animatie bevindt het element zich fysiek op de nieuwe positie.

Hoe stop ik Property Animation?

Roep animator.cancel() aan — de animatie stopt onmiddellijk, de eindwaarde wordt niet toegepast. Aanroep animator.end() — de animatie gaat naar de eindtoestand en stopt. Voor AnimatorSet — set.cancel() stopt alle animaties in de set. Animator.pause() en resume() zijn beschikbaar op API 19+ voor tijdelijk pauzeren.

Welke Interpolator moet ik gebruiken voor verschillende soorten animaties?

Material Design beveelt aan: FastOutSlowInInterpolator — voor het verschijnen en verdwijnen van elementen, LinearInterpolator — voor laadindicatoren, OvershootInterpolator — voor accenteffecten (knoppen), BounceInterpolator — voor pull-to-refresh en veerkrachtige elementen. Gebruik voor animatie van verschijnen vanaf de rand van het scherm AccelerateDecelerateInterpolator.

Waarom animeert ObjectAnimator de eigenschap niet?

Controleer: (1) het object heeft een publieke setter voor de opgegeven eigenschap (setPropertyName()), (2) de eigenschap is in camelCase geschreven met een kleine letter na «set», (3) de setter accepteert hetzelfde type dat u doorgeeft (ofFloat → setPropertyName(float)). Voor View hebben alle standaard eigenschappen (alpha, translationX, rotation enz.) een setter.

Wanneer gebruik ik ObjectAnimator in plaats van ValueAnimator?

ObjectAnimator — wanneer u één standaard View-eigenschap animeert (alpha, translationX, rotation). ValueAnimator — wanneer u meerdere eigenschappen vanuit één luisteraar moet bijwerken, niet-View eigenschappen (voortgang, aangepaste weergave) animeert, of wanneer het object geen setter heeft voor de gewenste eigenschap. ValueAnimator is flexibeler, maar vereist meer code voor handmatige update.

Samenvatting

  • Property Animation — Android-framework voor het animeren van werkelijke objecteigenschappen via Animator.
  • ObjectAnimator — animatie van een specifieke objecteigenschap met opgegeven start/end-waarden.
  • ValueAnimator — genereren van geanimeerde waarden met handmatige update in onAnimationUpdate.
  • AnimatorSet — orkestratie van meerdere animators sequentieel of parallel.
  • Interpolator — snelheidscurve: FastOutSlowIn, Linear, Bounce, Overshoot, aangepast.
  • TypeEvaluator — interpolatieregel tussen waarden voor aangepaste gegevenstypen.
  • Property Values Holder (PropertyValuesHolder) — optimalisatie voor parallelle animatie van meerdere eigenschappen.

We ontwikkelen een mobiele applicatie turnkey

IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.

Bespreek het project

Lees ook