Property Animation — سیستم انیمیشن در Android است که در Android 3.0 (API 11) معرفی شد و خصوصیات واقعی اشیاء (نه فقط View) را در یک بازه زمانی مشخص تغییر میدهد. برخلاف View Animation قدیمی، Property Animation فیلدهای واقعی شیء — مختصات، اندازه، شفافیت، رنگ — را تغییر میدهد، نه فقط نمایش بصری را. به گزارش Google Android Developers (2026)، Property Animation در 89٪ از برنامههای Android از صد برنامه برتر استفاده میشود. درباره سایر انواع انیمیشن در راهنمای کلی انیمیشن بیشتر بخوانید.
نکات اصلی
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 تنظیم شده صحیح و absence محاسبات سنگین در onAnimationUpdate() کار میکند. برای انیمیشنهای پیچیده (3D، فیزیک) در Android 12+ از RenderThread (RenderNode Animations) توصیه میشود. 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+ عنصر همزمان به جای 20 Animator جداگانه از PropertyValuesHolder در یک 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 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، element از نظر بصری جابجا شده است، اما کلیکها در موقعیت اصلی پردازش میشوند. Property Animation (ObjectAnimator) خصوصیت واقعی را تغییر میدهد — پس از انیمیشن، element از نظر فیزیکی در موقعیت جدید قرار دارد.
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 از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید