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 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 — најпопуларнија класа Property Animation. Наслеђује од ValueAnimator и аутоматски позива setter наведеног својства објекта са анимираним вредностима. За рад ObjectAnimator захтева да објекат има јавни setter за анимирано својство (нпр. setTranslationX(float) за својство «translationX»).
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.
// 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 — базна класа Property Animation која генерише анимиране вредности од start до end за задато време. За разлику од ObjectAnimator, ValueAnimator није везан за објекат — он само израчунава међувредности и обавештава кроз слушаоца. Програмер сам одлучује шта ће радити са добијеним вредностима: поставити својство View, променити параметар Drawable, ажурирати прилагођено цртање у onDraw().
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 за свако својство.
// 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 — оркестратор који омогућава покретање више Animator (ObjectAnimator, ValueAnimator) одређеним редоследом: секвенцијално (playSequentially), паралелно (playTogether), са кашњењима (after, before, with). AnimatorSet подржава угнежђење — AnimatorSet може садржати друге AnimatorSet за сложене сценарије.
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 одређује криву промене брзине анимације од 0 до 1. Android пружа уграђене Interpolator: LinearInterpolator (равномерно), AccelerateDecelerateInterpolator (споро-брзо-споро), FastOutSlowInInterpolator (Material Design), OvershootInterpolator (са прелетањем циља), BounceInterpolator (са одбијањем), AnticipateOvershootInterpolator (са повлачењем уназад пре почетка и прелетањем циља). Прилагођени Interpolator се имплементира кроз TimeInterpolator.
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 — прима низ имена својстава и одговарајућих вредности.
// Прилагођени 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()
}
Често постављана питања
View Animation (Tween Animation) мења само визуелни приказ View кроз matrix transform, не утичући на реална својства објекта. Након анимације translationX у View Animation елемент је визуелно померен, али кликови се обрађују на оригиналној позицији. Property Animation (ObjectAnimator) мења реално својство — након анимације елемент се физички налази на новој позицији.
Позовите animator.cancel() — анимација се зауставља одмах, коначна вредност се не примењује. Позив animator.end() — анимација прелази у коначно стање и зауставља се. За AnimatorSet — set.cancel() зауставља све анимације у сету. Animator.pause() и resume() доступни су на API 19+ за привремену паузу.
Material Design препоручује: FastOutSlowInInterpolator — за појављивање и нестајање елемената, LinearInterpolator — за индикаторе учитавања, OvershootInterpolator — за акцентне ефекте (дугмад), BounceInterpolator — за pull-to-refresh и опружне елементе. За анимацију појављивања са ивице екрана користите AccelerateDecelerateInterpolator.
Проверите: (1) објекат има јавни setter за наведено својство (setPropertyName()), (2) својство је написано у camelCase малим словом после «set», (3) setter прихвата исти тип који прослеђујете (ofFloat → setPropertyName(float)). За View сва стандардна својства (alpha, translationX, rotation итд.) имају setter.
ObjectAnimator — када анимирате једно стандардно својство View (alpha, translationX, rotation). ValueAnimator — када треба ажурирати више својстава из једног слушаоца, анимирати не-View својства (прогрес, прилагођено цртање), или када објекат нема setter за потребно својство. ValueAnimator је флексибилнији, али захтева више кода за ручно ажурирање.
Резиме
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође