Property Animation: шта је то, ObjectAnimator и ValueAnimator

Аутор: IT Sectr Објављено: 2026-02-28 Време читања: 10 мин

Property Animation — систем анимације у Android, представљен у Android 3.0 (API 11), који мења реална својства објеката (не само View) кроз задати временски интервал. За разлику од застареле View Animation, Property Animation мења стварна поља објекта — координате, величину, провидност, боју — а не само визуелни приказ. Према подацима Google Android Developers (2026), Property Animation се користи у 89% Android апликација из топ-100. Више о другим врстама анимације прочитајте у општем водичу за анимацију.

Главно

  • Property Animation — систем анимације Android за промену својстава објеката преко Animator.
  • ObjectAnimator — главна класа за анимацију одређеног својства објекта са наведеним вредностима.
  • ValueAnimator — базна класа која генерише анимиране вредности без везивања за одређени објекат.
  • AnimatorSet — омогућава комбиновање више аниматора у секвенцу или паралелни сет.
  • Property Animation подржава Interpolator, TypeEvaluator и ослушкивање преко AnimatorListener.

Шта је Property Animation?

Property Animation — је фрејмворк у Android SDK (пакет android.animation) који анимира било која својства било ког објекта (View, Drawable, прилагођена класа) у одређеном времену. За разлику од View Animation, која ради само са View и мења само визуелни приказ (matrix transform), Property Animation мења стварна поља објекта. То значи да након анимације translationX објекат заиста стоји на новој позицији, а кликови се обрађују на новом месту.

Архитектура Property Animation изграђена је на три кључне класе: ValueAnimator — базни генератор вредности, ObjectAnimator — подкласа за везивање за својство објекта, AnimatorSet — оркестратор за групну анимацију. Све три подржавају Interpolator (крива брзине) и TypeEvaluator (правило интерполације између вредности).

Према подацима Android Performance Patterns (Google, 2025), Property Animation ради на фреквенцији до 60 FPS при правилно подешеном Interpolator и без тешких прорачуна у onAnimationUpdate(). За сложене анимације (3D, физика) препоручује се RenderThread (RenderNode Animations) у Android 12+. Property Animation остаје главни избор за анимацију својстава View — translationX, rotationY, scaleX, alpha и других.

ObjectAnimator: анимација својстава објекта

ObjectAnimator — најпопуларнија класа Property Animation. Наслеђује од ValueAnimator и аутоматски позива setter наведеног својства објекта са анимираним вредностима. За рад ObjectAnimator захтева да објекат има јавни setter за анимирано својство (нпр. setTranslationX(float) за својство «translationX»).

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

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

Подржана својства View: translationX, translationY, translationZ, rotation, rotationX, rotationY, scaleX, scaleY, alpha, x, y, elevation. ObjectAnimator.ofFloat() се користи за float својства, ofInt() — за int, ofObject() — за прилагођене типове (боја, тачка). За анимацију боје користите ofObject() са ArgbEvaluator или HsvEvaluator.

kotlin
// ObjectAnimator са прилагођеним TypeEvaluator (боја)
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()
}

// Анимација више својстава истовремено
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 — интерфејс за праћење догађаја анимације: onAnimationStart, onAnimationEnd, onAnimationCancel, onAnimationRepeat. Користите AnimatorListenerAdapter за преоптерећивање само потребних метода. Од Android 12 додат је Animator.AnimationCallback са подршком за корутине кроз suspendAnimationFrame.

ValueAnimator: генерисање анимираних вредности

ValueAnimator — базна класа Property Animation која генерише анимиране вредности од start до end за задато време. За разлику од ObjectAnimator, ValueAnimator није везан за објекат — он само израчунава међувредности и обавештава кроз слушаоца. Програмер сам одлучује шта ће радити са добијеним вредностима: поставити својство View, променити параметар Drawable, ажурирати прилагођено цртање у onDraw().

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

"> ValueAnimator: анимация прогресса загрузки
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() — користи се за целобројна својства (ширина, висина, број корака). ValueAnimator.ofObject() — за прилагођене типове са TypeEvaluator. ValueAnimator.ofPropertyValuesHolder() — за паралелну анимацију више својстава са једним тајмером, што штеди ресурсе у поређењу са одвојеним Animator за свако својство.

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

Перформансе ValueAnimator: при фреквенцији 60 FPS onAnimationUpdate се позива сваких ~16.7 ms. Избегавајте унутар слушаоца: алокацију објеката (креирајте PointF/RectF једном), позивање findViewById(), тешке прорачуне (фајловски улаз-излаз, мрежа). За анимацију 20+ истовремених елемената користите PropertyValuesHolder у једном Animator уместо 20 одвојених Animator. За анимацију са променом величине користите View.setLayoutParams() само на крају анимације (кроз AnimatorListenerAdapter.onAnimationEnd).

AnimatorSet: композиција анимација

AnimatorSet — оркестратор који омогућава покретање више Animator (ObjectAnimator, ValueAnimator) одређеним редоследом: секвенцијално (playSequentially), паралелно (playTogether), са кашњењима (after, before, with). AnimatorSet подржава угнежђење — AnimatorSet може садржати друге AnimatorSet за сложене сценарије.

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

// AnimatorSet: секвенцијална и паралелна анимација
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 {
    // Паралелно: fadeIn + slideUp
    play(fadeIn).with(slideUp)
    "> После: bounce с задержкой 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 пружа fluent API за изградњу ланаца: with() — паралелно, before() — пре, after() — после. AnimatorSet подржава cancel() за заустављање свих анимација у сету. За сложене сценарије (25+ аниматора) користите PropertyValuesHolder — ефикаснији је јер користи један заједнички тајмер уместо одвојених за сваки Animator.

Builder методОписПример
with(Animator)Паралелно покретање са тренутном анимацијомplay(fadeIn).with(slideUp)
before(Animator)Тренутна анимација пре наведенеplay(fadeIn).before(bounce)
after(Animator)Тренутна анимација после наведенеplay(bounce).after(slideUp)
after(Long)Кашњење пре тренутне анимацијеplay(bounce).after(200L)

Interpolator и TypeEvaluator: управљање брзином и типом

Interpolator одређује криву промене брзине анимације од 0 до 1. Android пружа уграђене Interpolator: LinearInterpolator (равномерно), AccelerateDecelerateInterpolator (споро-брзо-споро), FastOutSlowInInterpolator (Material Design), OvershootInterpolator (са прелетањем циља), BounceInterpolator (са одбијањем), AnticipateOvershootInterpolator (са повлачењем уназад пре почетка и прелетањем циља). Прилагођени Interpolator се имплементира кроз TimeInterpolator.

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

// BounceInterpolator — ефекат одбијања на крају
val bounceAnim = ObjectAnimator.ofFloat(myView, "translationY", 0f, -50f).apply {
    duration = 600L
    interpolator = BounceInterpolator()
    start()
}

// AnticipateOvershoot — повлачење уназад, затим прелет
val anticipateAnim = ObjectAnimator.ofFloat(myView, "scaleX", 1f, 1.3f).apply {
    duration = 500L
    interpolator = AnticipateOvershootInterpolator(2.0f)
    start()
}

TypeEvaluator — интерфејс са методом evaluate(fraction, startValue, endValue) која израчунава међувредност између start и end. Уграђени: ArgbEvaluator (боја int), FloatEvaluator, IntEvaluator, PointFEvaluator, RectEvaluator. За прилагођене типове података (нпр. анимација прилагођене класе са три поља) имплементирајте свој TypeEvaluator. За анимацију више View са истим подешавањима користите PropertyValuesHolder — прима низ имена својстава и одговарајућих вредности.

kotlin
// Прилагођени TypeEvaluator за класу 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 — максимальная производительность
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()
}

Често постављана питања

Чим се Property Animation разликује од View Animation?

View Animation (Tween Animation) мења само визуелни приказ View кроз matrix transform, не утичући на реална својства објекта. Након анимације translationX у View Animation елемент је визуелно померен, али кликови се обрађују на оригиналној позицији. Property Animation (ObjectAnimator) мења реално својство — након анимације елемент се физички налази на новој позицији.

Како зауставити Property Animation?

Позовите animator.cancel() — анимација се зауставља одмах, коначна вредност се не примењује. Позив animator.end() — анимација прелази у коначно стање и зауставља се. За AnimatorSet — set.cancel() зауставља све анимације у сету. Animator.pause() и resume() доступни су на API 19+ за привремену паузу.

Који Interpolator користити за различите типове анимације?

Material Design препоручује: FastOutSlowInInterpolator — за појављивање и нестајање елемената, LinearInterpolator — за индикаторе учитавања, OvershootInterpolator — за акцентне ефекте (дугмад), BounceInterpolator — за pull-to-refresh и опружне елементе. За анимацију појављивања са ивице екрана користите AccelerateDecelerateInterpolator.

Зашто ObjectAnimator не анимира својство?

Проверите: (1) објекат има јавни setter за наведено својство (setPropertyName()), (2) својство је написано у camelCase малим словом после «set», (3) setter прихвата исти тип који прослеђујете (ofFloat → setPropertyName(float)). За View сва стандардна својства (alpha, translationX, rotation итд.) имају setter.

Када користити ObjectAnimator уместо ValueAnimator?

ObjectAnimator — када анимирате једно стандардно својство View (alpha, translationX, rotation). ValueAnimator — када треба ажурирати више својстава из једног слушаоца, анимирати не-View својства (прогрес, прилагођено цртање), или када објекат нема setter за потребно својство. ValueAnimator је флексибилнији, али захтева више кода за ручно ажурирање.

Резиме

  • Property Animation — Android фрејмворк за анимацију реалних својстава објеката кроз Animator.
  • ObjectAnimator — анимација одређеног својства објекта са задатим start/end вредностима.
  • ValueAnimator — генерисање анимираних вредности са ручним ажурирањем у onAnimationUpdate.
  • AnimatorSet — оркестрација више аниматора секвенцијално или паралелно.
  • Interpolator — крива брзине: FastOutSlowIn, Linear, Bounce, Overshoot, прилагођени.
  • TypeEvaluator — правило интерполације између вредности за прилагођене типове података.
  • Property Values Holder (PropertyValuesHolder) — оптимизација за паралелну анимацију више својстава.

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође