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 از صد برنامه برتر استفاده می‌شود. درباره سایر انواع انیمیشن در راهنمای کلی انیمیشن بیشتر بخوانید.

نکات اصلی

  • 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 تنظیم شده صحیح و absence محاسبات سنگین در onAnimationUpdate() کار می‌کند. برای انیمیشن‌های پیچیده (3D، فیزیک) در Android 12+ از RenderThread (RenderNode Animations) توصیه می‌شود. 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+ عنصر همزمان به جای 20 Animator جداگانه از PropertyValuesHolder در یک 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 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، element از نظر بصری جابجا شده است، اما کلیک‌ها در موقعیت اصلی پردازش می‌شوند. Property Animation (ObjectAnimator) خصوصیت واقعی را تغییر می‌دهد — پس از انیمیشن، element از نظر فیزیکی در موقعیت جدید قرار دارد.

چگونه 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 دارند.

چه زمانی به جای ValueAnimator از ObjectAnimator استفاده کنیم؟

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 از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه

همچنین بخوانید