Property Animation — Android 3.0 (API 11)-da təqdim edilmiş, obyektlərin (təkcə View deyil) real xüsusiyyətlərini müəyyən vaxt intervalında dəyişən Android animasiya sistemidir. Köhnəlmiş View Animation-dan fərqli olaraq, Property Animation obyektin faktiki sahələrini — koordinatları, ölçüsü, şəffaflığı, rəngi — yalnız vizual göstərməyi deyil, dəyişir. Google Android Developers (2026) məlumatına görə, Property Animation top-100 Android tətbiqlərinin 89%-da istifadə olunur. Digər animasiya növləri haqqında ətraflı ümumi animasiya bələdçisində oxuyun.
Əsas məqamlar
Property Animation — Android SDK-da (paket android.animation) istənilən obyektin (View, Drawable, xüsusi sinif) istənilən xüsusiyyətlərini müəyyən vaxt ərzində animasiya edən freymvorkdur. Yalnız View ilə işləyən və vizual təsviri (matrix transform) dəyişən View Animation-dan fərqli olaraq, Property Animation obyektin real sahələrini dəyişir. Bu o deməkdir ki, translationX animasiyasından sonra obyekt həqiqətən yeni mövqedə yerləşir və kliklər yeni yerdə işlənir.
Property Animation arxitekturası üç əsas sinif üzərində qurulub: ValueAnimator — baza dəyər generatoru, ObjectAnimator — obyekt xüsusiyyətinə bağlanmaq üçün alt sinif, AnimatorSet — qrup animasiyası üçün orkestrator. Hər üçü Interpolator (sürət əyrisi) və TypeEvaluator (dəyərlər arasında interpolasiya qaydası) dəstəkləyir.
Android Performance Patterns (Google, 2025) məlumatına görə, Property Animation düzgün konfiqurasiya edilmiş Interpolator və onAnimationUpdate()-də ağır hesablamalar olmadıqda 60 FPS tezliyində işləyir. Mürəkkəb animasiyalar (3D, fizika) üçün Android 12+-də RenderThread (RenderNode Animations) tövsiyə olunur. Property Animation View xüsusiyyətlərinin — translationX, rotationY, scaleX, alpha və digərlərinin animasiyası üçün əsas seçim olaraq qalır.
ObjectAnimator — Property Animation-ın ən populyar sinfi. ValueAnimator-dan miras alır və avtomatik olaraq obyektin göstərilən xüsusiyyətinin setter-ni animasiya dəyərləri ilə çağırır. ObjectAnimator-un işləməsi üçün obyektin animasiya edilən xüsusiyyət üçün public setter-i olmalıdır (məsələn, «translationX» xüsusiyyəti üçün setTranslationX(float)).
import android.animation.ObjectAnimator
import android.view.View
// ObjectAnimator translationX üçün
val animator = ObjectAnimator.ofFloat(
myView,
"translationX",
0f,
300f
).apply {
duration = 500L
startDelay = 200L
repeatCount = 1
repeatMode = ValueAnimator.REVERSE
interpolator = FastOutSlowInInterpolator()
start()
}
Dəstəklənən View xüsusiyyətləri: translationX, translationY, translationZ, rotation, rotationX, rotationY, scaleX, scaleY, alpha, x, y, elevation. ObjectAnimator.ofFloat() float xüsusiyyətləri üçün, ofInt() — int üçün, ofObject() — xüsusi tiplər (rəng, nöqtə) üçün istifadə olunur. Rəng animasiyası üçün ArgbEvaluator və ya HsvEvaluator ilə ofObject() istifadə edin.
// ObjectAnimator xüsusi TypeEvaluator ilə (rəng)
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()
}
// Bir neçə xüsusiyyətin eyni vaxtda animasiyası
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 — animasiya hadisələrini izləmək üçün interfeys: onAnimationStart, onAnimationEnd, onAnimationCancel, onAnimationRepeat. Yalnız lazımi metodları əvəz etmək üçün AnimatorListenerAdapter istifadə edin. Android 12-dən etibarən suspendAnimationFrame vasitəsilə korutin dəstəyi ilə Animator.AnimationCallback əlavə edilib.
ValueAnimator — Property Animation-ın baza sinfi, start-dan end-ə qədər müəyyən vaxtda animasiya dəyərləri yaradır. ObjectAnimator-dan fərqli olaraq, ValueAnimator obyektə bağlı deyil — o sadəcə aralıq dəyərləri hesablayır və dinləyici vasitəsilə xəbərdar edir. Tərtibatçı alınan dəyərlərlə nə edəcəyinə özü qərar verir: View xüsusiyyətini təyin etmək, Drawable parametrini dəyişmək, onDraw()-da xüsusi çəkməni yeniləmək.
import android.animation.ValueAnimator
import android.view.animation.LinearInterpolator
"> ValueAnimator: yüklənmə gedişatının animasiyası
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() — tam ədəd xüsusiyyətləri üçün (en, hündürlük, addım sayı). ValueAnimator.ofObject() — TypeEvaluator ilə xüsusi tiplər üçün. ValueAnimator.ofPropertyValuesHolder() — bir timer ilə bir neçə xüsusiyyətin paralel animasiyası üçün, bu, hər xüsusiyyət üçün ayrıca Animator ilə müqayisədə resurslara qənaət edir.
// ValueAnimator.ofObject PointEvaluator ilə
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 performansı: 60 FPS tezliyində onAnimationUpdate hər ~16.7 ms çağrılır. Dinləyici içərisində bunlardan çəkinin: obyekt alokasiyası (PointF/RectF bir dəfə yaradın), findViewById() çağırışı, ağır hesablamalar (fayl giriş-çıxışı, şəbəkə). 20+ eyni vaxtda elementin animasiyası üçün 20 ayrı Animator əvəzinə bir Animator-da PropertyValuesHolder istifadə edin. Ölçü dəyişikliyi ilə animasiya üçün View.setLayoutParams() yalnız animasiyanın sonunda (AnimatorListenerAdapter.onAnimationEnd vasitəsilə) istifadə edin.
AnimatorSet — bir neçə Animator-u (ObjectAnimator, ValueAnimator) müəyyən ardıcıllıqla işə salmağa imkan verən orkestratordur: ardıcıl (playSequentially), paralel (playTogether), gecikmələrlə (after, before, with). AnimatorSet iç-içə yerləşdirməni dəstəkləyir — AnimatorSet mürəkkəb ssenarilər üçün digər AnimatorSet-lər ehtiva edə bilər.
import android.animation.AnimatorSet
import android.animation.ObjectAnimator
// AnimatorSet: ardıcıl və paralel animasiya
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 {
// Paralel: fadeIn + slideUp
play(fadeIn).with(slideUp)
"> Sonra: 200ms gecikmə ilə bounce
play(bounce).after(200L)
duration = 400L
interpolator = FastOutSlowInInterpolator()
addListener(object : AnimatorListenerAdapter() {
override fun onAnimationEnd(animation: Animator) {
Log.d("Anim", "Set completed")
}
})
start()
}
AnimatorSet.Builder zəncirlər qurmaq üçün fluent API təqdim edir: with() — paralel, before() — əvvəl, after() — sonra. AnimatorSet dəstdəki bütün animasiyaları dayandırmaq üçün cancel() dəstəkləyir. Mürəkkəb ssenarilər (25+ animator) üçün PropertyValuesHolder istifadə edin — hər Animator üçün ayrıca timer əvəzinə bir ümumi timer istifadə etdiyi üçün daha məhsuldardır.
| Builder metodu | Təsvir | Nümunə |
|---|---|---|
| with(Animator) | Cari animasiya ilə paralel işə salma | play(fadeIn).with(slideUp) |
| before(Animator) | Cari animasiya göstəriləndən əvvəl | play(fadeIn).before(bounce) |
| after(Animator) | Cari animasiya göstəriləndən sonra | play(bounce).after(slideUp) |
| after(Long) | Cari animasiyadan əvvəl gecikmə | play(bounce).after(200L) |
Interpolator animasiya sürətinin 0-dan 1-ə qədər dəyişmə əyrisini təyin edir. Android daxili Interpolator-lar təqdim edir: LinearInterpolator (bərabər), AccelerateDecelerateInterpolator (yavaş-sürətli-yavaş), FastOutSlowInInterpolator (Material Design), OvershootInterpolator (hədəfi aşaraq), BounceInterpolator (sıçrayışla), AnticipateOvershootInterpolator (başlamazdan əvvəl geri çəkilmə və hədəfi aşma). Xüsusi Interpolator TimeInterpolator vasitəsilə tətbiq edilir.
import android.animation.ObjectAnimator
import android.view.animation.BounceInterpolator
import android.view.animation.OvershootInterpolator
import android.view.animation.AnticipateOvershootInterpolator
// BounceInterpolator — sonda sıçrayış effekti
val bounceAnim = ObjectAnimator.ofFloat(myView, "translationY", 0f, -50f).apply {
duration = 600L
interpolator = BounceInterpolator()
start()
}
// AnticipateOvershoot — geri çəkilmə, sonra aşma
val anticipateAnim = ObjectAnimator.ofFloat(myView, "scaleX", 1f, 1.3f).apply {
duration = 500L
interpolator = AnticipateOvershootInterpolator(2.0f)
start()
}
TypeEvaluator — start və end arasında aralıq dəyəri hesablayan evaluate(fraction, startValue, endValue) metodu olan interfeys. Daxili: ArgbEvaluator (rəng int), FloatEvaluator, IntEvaluator, PointFEvaluator, RectEvaluator. Xüsusi məlumat tipləri üçün (məsələn, üç sahəli xüsusi sinfin animasiyası) öz TypeEvaluator-nızı tətbiq edin. Eyni parametrlərlə bir neçə View-ın animasiyası üçün PropertyValuesHolder istifadə edin — xüsusiyyət adları və uyğun dəyərlər massivi qəbul edir.
// Xüsusi TypeEvaluator ProgressState sinfi üçün
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 — maksimum performans
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()
}
Tez-tez verilən suallar
View Animation (Tween Animation) View-in yalnız vizual təsvirini matrix transform vasitəsilə dəyişir, obyektin real xüsusiyyətlərinə təsir etmir. View Animation-da translationX animasiyasından sonra element vizual olaraq yerdəyişmiş olur, lakin kliklər orijinal mövqedə işlənir. Property Animation (ObjectAnimator) real xüsusiyyəti dəyişir — animasiyadan sonra element fiziki olaraq yeni mövqedə yerləşir.
animator.cancel() çağırın — animasiya dərhal dayanır, son dəyər tətbiq edilmir. animator.end() çağırışı — animasiya son vəziyyətə keçir və dayanır. AnimatorSet üçün — set.cancel() dəstdəki bütün animasiyaları dayandırır. Animator.pause() və resume() müvəqqəti dayandırma üçün API 19+-da mövcuddur.
Material Design tövsiyə edir: FastOutSlowInInterpolator — elementlərin görünməsi və yox olması üçün, LinearInterpolator — yükləmə göstəriciləri üçün, OvershootInterpolator — vurğu effektləri (düymələr) üçün, BounceInterpolator — pull-to-refresh və yay elementləri üçün. Ekran kənarından görünmə animasiyası üçün AccelerateDecelerateInterpolator istifadə edin.
Yoxlayın: (1) obyektin göstərilən xüsusiyyət üçün public setter-i var (setPropertyName()), (2) xüsusiyyət «set»-dən sonra kiçik hərflə camelCase yazılıb, (3) setter sizin ötürdüyünüz eyni tipi qəbul edir (ofFloat → setPropertyName(float)). View üçün bütün standart xüsusiyyətlər (alpha, translationX, rotation və s.) setter-ə malikdir.
ObjectAnimator — View-in bir standart xüsusiyyətini (alpha, translationX, rotation) animasiya edərkən. ValueAnimator — bir dinləyicidən bir neçə xüsusiyyəti yeniləmək, View olmayan xüsusiyyətləri (proqress, xüsusi çəkmə) animasiya etmək və ya obyektin lazımi xüsusiyyət üçün setter-i olmadıqda. ValueAnimator daha çevikdir, lakin əl ilə yeniləmə üçün daha çox kod tələb edir.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun