Property Animation: vad är det, ObjectAnimator och ValueAnimator

Författare: IT Sectr Publicerad: 2026-02-28 Lästid: 10 min

Property Animation — ett animationssystem i Android, introducerat i Android 3.0 (API 11), som ändrar verkliga egenskaper hos objekt (inte bara View) inom ett givet tidsintervall. Till skillnad från föråldrad View Animation, ändrar Property Animation objektets faktiska fält — koordinater, storlek, genomskinlighet, färg — inte bara den visuella representationen. Enligt Google Android Developers (2026) används Property Animation i 89% av Android-apparna från topp-100. Läs mer om andra typer av animering i den allmänna guiden om animering.

Huvudpunkter

  • Property Animation — Android-animationssystem för att ändra objektegenskaper via Animator.
  • ObjectAnimator — huvudklassen för animering av en specifik objektegenskap med angivna värden.
  • ValueAnimator — basklass som genererar animerade värden utan bindning till ett specifikt objekt.
  • AnimatorSet — gör det möjligt att kombinera flera animatorer i en sekvens eller parallell uppsättning.
  • Property Animation stöder Interpolator, TypeEvaluator och lyssning via AnimatorListener.

Vad är Property Animation?

Property Animation — är ett ramverk i Android SDK (paket android.animation) som animerar alla egenskaper hos alla objekt (View, Drawable, anpassad klass) under en angiven tid. Till skillnad från View Animation, som bara fungerar med View och endast ändrar den visuella representationen (matrix transform), ändrar Property Animation objektets faktiska fält. Detta innebär att efter animering av translationX befinner sig objektet verkligen på den nya positionen och klickningar bearbetas på den nya platsen.

Arkitekturen för Property Animation bygger på tre nyckelklasser: ValueAnimator — basgenerator av värden, ObjectAnimator — underklass för bindning till objektegenskap, AnimatorSet — orkestrator för gruppanimering. Alla tre stöder Interpolator (hastighetskurva) och TypeEvaluator (interpolationsregel mellan värden).

Enligt Android Performance Patterns (Google, 2025) fungerar Property Animation med frekvens upp till 60 FPS med korrekt konfigurerad Interpolator och utan tunga beräkningar i onAnimationUpdate(). För komplexa animeringar (3D, fysik) rekommenderas RenderThread (RenderNode Animations) i Android 12+. Property Animation förblir det främsta valet för animering av View-egenskaper — translationX, rotationY, scaleX, alpha och andra.

ObjectAnimator: animering av objektegenskaper

ObjectAnimator — den populäraste klassen i Property Animation. Den ärver från ValueAnimator och anropar automatiskt setter för den angivna egenskapen hos objektet med animerade värden. För att fungera kräver ObjectAnimator att objektet har en publik setter för den egenskap som animeras (t.ex. setTranslationX(float) för egenskapen «translationX»).

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

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

Stödda View-egenskaper: translationX, translationY, translationZ, rotation, rotationX, rotationY, scaleX, scaleY, alpha, x, y, elevation. ObjectAnimator.ofFloat() används för float-egenskaper, ofInt() — för int, ofObject() — för anpassade typer (färg, punkt). För färganimering använd ofObject() med ArgbEvaluator eller HsvEvaluator.

kotlin
// ObjectAnimator med anpassad TypeEvaluator (färg)
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()
}

// Animering av flera egenskaper samtidigt
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 — gränssnitt för att spåra animationshändelser: onAnimationStart, onAnimationEnd, onAnimationCancel, onAnimationRepeat. Använd AnimatorListenerAdapter för att bara åsidosätta nödvändiga metoder. Från och med Android 12 har Animator.AnimationCallback lagts till med stöd för korutiner via suspendAnimationFrame.

ValueAnimator: generering av animerade värden

ValueAnimator — basklassen i Property Animation som genererar animerade värden från start till end under en angiven tid. Till skillnad från ObjectAnimator är ValueAnimator inte bundet till ett objekt — det beräknar bara mellanliggande värden och meddelar via en lyssnare. Utvecklaren bestämmer själv vad som ska göras med de mottagna värdena: ställa in en View-egenskap, ändra en Drawable-parameter, uppdatera anpassad ritning i onDraw().

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

"> ValueAnimator: animering av laddningsförloppet
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() — används för heltalsegenskaper (bredd, höjd, antal steg). ValueAnimator.ofObject() — för anpassade typer med TypeEvaluator. ValueAnimator.ofPropertyValuesHolder() — för parallell animering av flera egenskaper med en timer, vilket sparar resurser jämfört med separata Animator för varje egenskap.

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

Prestanda för ValueAnimator: vid frekvensen 60 FPS anropas onAnimationUpdate varje ~16.7 ms. Undvik inuti lyssnaren: objektallokering (skapa PointF/RectF en gång), anropa findViewById(), tunga beräkningar (fil-I/O, nätverk). För animering av 20+ samtidiga element, använd PropertyValuesHolder i en Animator istället för 20 separata Animator. För animering med storleksändring, använd View.setLayoutParams() endast i slutet av animeringen (via AnimatorListenerAdapter.onAnimationEnd).

AnimatorSet: komposition av animeringar

AnimatorSet — orkestrator som gör det möjligt att köra flera Animator (ObjectAnimator, ValueAnimator) i en viss ordning: sekventiellt (playSequentially), parallellt (playTogether), med fördröjningar (after, before, with). AnimatorSet stöder nästling — AnimatorSet kan innehålla andra AnimatorSet för komplexa scenarier.

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

// AnimatorSet: sekventiell och parallell animering
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 {
    // Parallellt: fadeIn + slideUp
    play(fadeIn).with(slideUp)
        "> Efter: bounce med 200ms fördröjning
    play(bounce).after(200L)

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

AnimatorSet.Builder tillhandahåller ett flytande API för att bygga kedjor: with() — parallellt, before() — före, after() — efter. AnimatorSet stöder cancel() för att stoppa alla animeringar i uppsättningen. För komplexa scenarier (25+ animatorer), använd PropertyValuesHolder — det är effektivare eftersom det använder en gemensam timer istället för separata timers för varje Animator.

Builder-metodBeskrivningExempel
with(Animator)Starta parallellt med aktuell animeringplay(fadeIn).with(slideUp)
before(Animator)Aktuell animering före angivenplay(fadeIn).before(bounce)
after(Animator)Aktuell animering efter angivenplay(bounce).after(slideUp)
after(Long)Fördröjning före aktuell animeringplay(bounce).after(200L)

Interpolator och TypeEvaluator: hantera hastighet och typ

Interpolator bestämmer kurvan för hastighetsändringen av animeringen från 0 till 1. Android tillhandahåller inbyggda Interpolator: LinearInterpolator (jämnt), AccelerateDecelerateInterpolator (långsamt-snabbt-långsamt), FastOutSlowInInterpolator (Material Design), OvershootInterpolator (med överskridande av målet), BounceInterpolator (med studs), AnticipateOvershootInterpolator (med tillbakadragande före starten och överskridande av målet). Anpassad Interpolator implementeras via TimeInterpolator.

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

// BounceInterpolator — studseffekt i slutet
val bounceAnim = ObjectAnimator.ofFloat(myView, "translationY", 0f, -50f).apply {
    duration = 600L
    interpolator = BounceInterpolator()
    start()
}

// AnticipateOvershoot — dra tillbaka, sedan överskrida
val anticipateAnim = ObjectAnimator.ofFloat(myView, "scaleX", 1f, 1.3f).apply {
    duration = 500L
    interpolator = AnticipateOvershootInterpolator(2.0f)
    start()
}

TypeEvaluator — gränssnitt med metoden evaluate(fraction, startValue, endValue) som beräknar mellanliggande värde mellan start och end. Inbyggda: ArgbEvaluator (färg int), FloatEvaluator, IntEvaluator, PointFEvaluator, RectEvaluator. För anpassade datatyper (t.ex. animering av en anpassad klass med tre fält) implementera din egen TypeEvaluator. För animering av flera View med samma inställningar, använd PropertyValuesHolder — den accepterar en array med egenskapsnamn och motsvarande värden.

kotlin
// Anpassad TypeEvaluator för klassen 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 — maximal prestanda
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()
}

Vanliga frågor

Vad är skillnaden mellan Property Animation och View Animation?

View Animation (Tween Animation) ändrar endast den visuella representationen av View via matrix transform, utan att påverka objektets verkliga egenskaper. Efter animering av translationX i View Animation är elementet visuellt förskjutet, men klickningar bearbetas på den ursprungliga positionen. Property Animation (ObjectAnimator) ändrar den verkliga egenskapen — efter animeringen befinner sig elementet fysiskt på den nya positionen.

Hur stoppar jag Property Animation?

Anropa animator.cancel() — animeringen stoppas omedelbart, slutvärdet tillämpas inte. Anrop av animator.end() — animeringen går till slutligt tillstånd och stoppas. För AnimatorSet — set.cancel() stoppar alla animeringar i uppsättningen. Animator.pause() och resume() är tillgängliga från API 19+ för tillfällig paus.

Vilken Interpolator ska jag använda för olika typer av animering?

Material Design rekommenderar: FastOutSlowInInterpolator — för att visa och dölja element, LinearInterpolator — för laddningsindikatorer, OvershootInterpolator — för accenteffekter (knappar), BounceInterpolator — för pull-to-refresh och fjädrande element. För animering av att visas från skärmkanten, använd AccelerateDecelerateInterpolator.

Varför animerar inte ObjectAnimator egenskapen?

Kontrollera: (1) objektet har en publik setter för den angivna egenskapen (setPropertyName()), (2) egenskapen är skriven i camelCase med liten bokstav efter «set», (3) settern accepterar samma typ som du skickar (ofFloat → setPropertyName(float)). För View har alla standardegenskaper (alpha, translationX, rotation etc.) setter.

När ska jag använda ObjectAnimator istället för ValueAnimator?

ObjectAnimator — när du animerar en standard View-egenskap (alpha, translationX, rotation). ValueAnimator — när du behöver uppdatera flera egenskaper från en lyssnare, animera icke-View-egenskaper (förlopp, anpassad ritning), eller när objektet inte har en setter för den önskade egenskapen. ValueAnimator är mer flexibel, men kräver mer kod för manuell uppdatering.

Sammanfattning

  • Property Animation — Android-ramverk för animering av verkliga objektegenskaper via Animator.
  • ObjectAnimator — animering av en specifik objektegenskap med angivna start/end-värden.
  • ValueAnimator — generering av animerade värden med manuell uppdatering i onAnimationUpdate.
  • AnimatorSet — orkestrering av flera animatorer sekventiellt eller parallellt.
  • Interpolator — hastighetskurva: FastOutSlowIn, Linear, Bounce, Overshoot, anpassad.
  • TypeEvaluator — interpolationsregel mellan värden för anpassade datatyper.
  • Property Values Holder (PropertyValuesHolder) — optimering för parallell animering av flera egenskaper.

Vi utvecklar en mobil applikation nyckelfärdigt

IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.

Diskutera projektet

Läs också