Property Animation : qu'est-ce que c'est, ObjectAnimator et ValueAnimator

Auteur : IT Sectr Publié le : 2026-02-28 Temps de lecture : 10 min

Property Animation est un système d'animation dans Android, introduit dans Android 3.0 (API 11), qui modifie les propriétés réelles des objets (pas seulement View) sur une période de temps déterminée. Contrairement à l'ancienne View Animation, Property Animation change les champs réels de l'objet — coordonnées, taille, transparence, couleur — et pas seulement l'affichage visuel. Selon Google Android Developers (2026), Property Animation est utilisée dans 89 % des applications Android du top 100. En savoir plus sur les autres types d'animation dans le guide général de l'animation.

Points clés

  • Property Animation — système d'animation Android pour modifier les propriétés des objets via Animator.
  • ObjectAnimator — la classe principale pour animer une propriété spécifique d'un objet avec des valeurs définies.
  • ValueAnimator — la classe de base qui génère des valeurs animées sans liaison à un objet spécifique.
  • AnimatorSet — permet de combiner plusieurs animateurs en séquence ou en ensemble parallèle.
  • Property Animation prend en charge Interpolator, TypeEvaluator et l'écoute via AnimatorListener.

Qu'est-ce que Property Animation ?

Property Animation est un framework dans Android SDK (package android.animation) qui anime toutes les propriétés de n'importe quel objet (View, Drawable, classe personnalisée) pendant une durée spécifiée. Contrairement à View Animation, qui fonctionne uniquement avec View et ne modifie que la représentation visuelle (transformation matricielle), Property Animation modifie les champs réels de l'objet. Cela signifie qu'après une animation translationX, l'objet se trouve réellement à la nouvelle position et les clics sont traités au nouvel emplacement.

L'architecture de Property Animation repose sur trois classes clés : ValueAnimator — le générateur de valeurs de base, ObjectAnimator — une sous-classe pour se lier à une propriété d'objet, AnimatorSet — un orchestrateur pour l'animation de groupe. Les trois prennent en charge Interpolator (courbe de vitesse) et TypeEvaluator (règle d'interpolation entre les valeurs).

Selon Android Performance Patterns (Google, 2025), Property Animation fonctionne jusqu'à 60 FPS avec un Interpolator correctement configuré et sans calculs lourds dans onAnimationUpdate(). Pour les animations complexes (3D, physique), RenderThread (RenderNode Animations) est recommandé dans Android 12+. Property Animation reste le choix principal pour animer les propriétés View — translationX, rotationY, scaleX, alpha et autres.

ObjectAnimator : animation des propriétés d'un objet

ObjectAnimator est la classe la plus populaire de Property Animation. Elle étend ValueAnimator et appelle automatiquement le setter de la propriété spécifiée de l'objet avec des valeurs animées. Pour qu'ObjectAnimator fonctionne, l'objet doit avoir un setter public pour la propriété à animer (par exemple, setTranslationX(float) pour la propriété « translationX »).

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

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

Propriétés View prises en charge : translationX, translationY, translationZ, rotation, rotationX, rotationY, scaleX, scaleY, alpha, x, y, elevation. ObjectAnimator.ofFloat() est utilisé pour les propriétés float, ofInt() pour int, ofObject() pour les types personnalisés (couleur, point). Pour l'animation de couleur, utilisez ofObject() avec ArgbEvaluator ou HsvEvaluator.

kotlin
// ObjectAnimator avec TypeEvaluator personnalisé (couleur)
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()
}

// Animer plusieurs propriétés simultanément
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 — une interface pour suivre les événements d'animation : onAnimationStart, onAnimationEnd, onAnimationCancel, onAnimationRepeat. Utilisez AnimatorListenerAdapter pour ne redéfinir que les méthodes nécessaires. À partir d'Android 12, Animator.AnimationCallback avec prise en charge des coroutines via suspendAnimationFrame a été ajouté.

ValueAnimator : génération de valeurs animées

ValueAnimator est la classe de base de Property Animation qui génère des valeurs animées du début à la fin sur une période donnée. Contrairement à ObjectAnimator, ValueAnimator n'est pas lié à un objet — il calcule simplement des valeurs intermédiaires et notifie via un écouteur. Le développeur décide quoi faire avec les valeurs obtenues : définir une propriété View, modifier un paramètre Drawable, mettre à jour le dessin personnalisé dans onDraw().

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

"> ValueAnimator : animation de la progression du chargement
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() — utilisé pour les propriétés entières (largeur, hauteur, nombre d'étapes). ValueAnimator.ofObject() — pour les types personnalisés avec TypeEvaluator. ValueAnimator.ofPropertyValuesHolder() — pour l'animation parallèle de plusieurs propriétés avec un seul minuteur, économisant des ressources par rapport à des Animators séparés pour chaque propriété.

kotlin
// ValueAnimator.ofObject avec 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()
}

Performances de ValueAnimator : à 60 FPS, onAnimationUpdate est appelé toutes les ~16,7 ms. Évitez à l'intérieur de l'écouteur : les allocations d'objets (créez PointF/RectF une fois), l'appel de findViewById(), les calculs lourds (E/S fichier, réseau). Pour animer 20+ éléments simultanément, utilisez PropertyValuesHolder dans un seul Animator au lieu de 20 Animators séparés. Pour une animation avec changement de taille, utilisez View.setLayoutParams() uniquement à la fin de l'animation (via AnimatorListenerAdapter.onAnimationEnd).

AnimatorSet : composition d'animations

AnimatorSet est un orchestrateur qui permet d'exécuter plusieurs instances d'Animator (ObjectAnimator, ValueAnimator) dans un ordre spécifique : séquentiellement (playSequentially), en parallèle (playTogether), avec des délais (after, before, with). AnimatorSet prend en charge l'imbrication — un AnimatorSet peut contenir d'autres AnimatorSets pour des scénarios complexes.

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

// AnimatorSet : animation séquentielle et parallèle
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 {
    // En parallèle : fadeIn + slideUp
    play(fadeIn).with(slideUp)
    "> Après : bounce avec un délai de 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 fournit une API fluide pour construire des chaînes : with() — en parallèle, before() — avant, after() — après. AnimatorSet prend en charge cancel() pour arrêter toutes les animations de l'ensemble. Pour les scénarios complexes (25+ animateurs), utilisez PropertyValuesHolder — il est plus performant car il utilise un seul minuteur partagé au lieu d'un séparé pour chaque Animator.

Méthode BuilderDescriptionExemple
with(Animator)Exécuter en parallèle avec l'animation actuelleplay(fadeIn).with(slideUp)
before(Animator)Animation actuelle avant celle spécifiéeplay(fadeIn).before(bounce)
after(Animator)Animation actuelle après celle spécifiéeplay(bounce).after(slideUp)
after(Long)Délai avant l'animation actuelleplay(bounce).after(200L)

Interpolator et TypeEvaluator : contrôle de la vitesse et du type

Interpolator définit la courbe de vitesse de l'animation de 0 à 1. Android fournit des Interpolators intégrés : LinearInterpolator (uniforme), AccelerateDecelerateInterpolator (lent-rapide-lent), FastOutSlowInInterpolator (Material Design), OvershootInterpolator (avec dépassement), BounceInterpolator (avec rebond), AnticipateOvershootInterpolator (avec recul avant le début et dépassement de la cible). Un Interpolator personnalisé est implémenté via TimeInterpolator.

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

// BounceInterpolator — effet de rebond à la fin
val bounceAnim = ObjectAnimator.ofFloat(myView, "translationY", 0f, -50f).apply {
    duration = 600L
    interpolator = BounceInterpolator()
    start()
}

// AnticipateOvershoot — recul, puis dépassement
val anticipateAnim = ObjectAnimator.ofFloat(myView, "scaleX", 1f, 1.3f).apply {
    duration = 500L
    interpolator = AnticipateOvershootInterpolator(2.0f)
    start()
}

TypeEvaluator — une interface avec la méthode evaluate(fraction, startValue, endValue) qui calcule la valeur intermédiaire entre le début et la fin. Intégrés : ArgbEvaluator (couleur int), FloatEvaluator, IntEvaluator, PointFEvaluator, RectEvaluator. Pour les types de données personnalisés (par exemple, animer une classe personnalisée avec trois champs), implémentez votre propre TypeEvaluator. Pour animer plusieurs Views avec les mêmes paramètres, utilisez PropertyValuesHolder — il accepte un tableau de noms de propriétés et de valeurs correspondantes.

kotlin
// TypeEvaluator personnalisé pour la classe 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 — performances maximales
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()
}

Foire aux questions

En quoi Property Animation diffère-t-elle de View Animation ?

View Animation (Tween Animation) modifie uniquement la représentation visuelle d'une View via une transformation matricielle, sans affecter les propriétés réelles de l'objet. Après une animation translationX dans View Animation, l'élément est visuellement déplacé, mais les clics sont toujours traités à la position d'origine. Property Animation (ObjectAnimator) modifie la propriété réelle — après l'animation, l'élément est physiquement à la nouvelle position.

Comment arrêter Property Animation ?

Appelez animator.cancel() — l'animation s'arrête immédiatement, la valeur finale n'est pas appliquée. L'appel de animator.end() — l'animation passe à l'état final et s'arrête. Pour AnimatorSet — set.cancel() arrête toutes les animations de l'ensemble. Animator.pause() et resume() sont disponibles sur API 19+ pour une pause temporaire.

Quel Interpolator utiliser pour différents types d'animation ?

Material Design recommande : FastOutSlowInInterpolator — pour les animations d'apparition et de disparition des éléments, LinearInterpolator — pour les indicateurs de chargement, OvershootInterpolator — pour les effets d'accentuation (boutons), BounceInterpolator — pour le pull-to-refresh et les éléments élastiques. Pour les animations apparaissant depuis l'extérieur de l'écran, utilisez AccelerateDecelerateInterpolator.

Pourquoi ObjectAnimator n'anime-t-il pas la propriété ?

Vérifiez : (1) l'objet a un setter public pour la propriété spécifiée (setPropertyName()), (2) la propriété est écrite en camelCase avec une lettre minuscule après « set », (3) le setter accepte le même type que vous passez (ofFloat → setPropertyName(float)). Pour View, toutes les propriétés standard (alpha, translationX, rotation, etc.) ont des setters.

Quand utiliser ObjectAnimator au lieu de ValueAnimator ?

ObjectAnimator — lorsque vous animez une seule propriété View standard (alpha, translationX, rotation). ValueAnimator — lorsque vous devez mettre à jour plusieurs propriétés à partir d'un seul écouteur, animer des propriétés non View (progression, dessin personnalisé), ou lorsque l'objet n'a pas de setter pour la propriété requise. ValueAnimator est plus flexible mais nécessite plus de code pour les mises à jour manuelles.

Résumé

  • Property Animation — framework Android pour animer les propriétés réelles des objets via Animator.
  • ObjectAnimator — animation d'une propriété spécifique d'un objet avec des valeurs de début/fin définies.
  • ValueAnimator — génération de valeurs animées avec mises à jour manuelles dans onAnimationUpdate.
  • AnimatorSet — orchestration de plusieurs animateurs séquentiellement ou en parallèle.
  • Interpolator — courbe de vitesse : FastOutSlowIn, Linear, Bounce, Overshoot, personnalisé.
  • TypeEvaluator — règle d'interpolation entre les valeurs pour les types de données personnalisés.
  • Property Values Holder (PropertyValuesHolder) — optimisation pour l'animation parallèle de plusieurs propriétés.

Nous développerons une application mobile clé en main

IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.

Discuter du projet

Lisez aussi