Property Animation Android میں ایک اینیمیشن سسٹم ہے، جو Android 3.0 (API 11) میں متعارف کرایا گیا، جو ایک مقررہ مدت کے دوران اشیاء (صرف View نہیں) کی حقیقی خصوصیات کو تبدیل کرتا ہے۔ پرانی View Animation کے برعکس، Property Animation شے کے حقیقی فیلڈز — کوآرڈینیٹ، سائز، شفافیت، رنگ — کو تبدیل کرتی ہے، نہ کہ صرف بصری ڈسپلے کو۔ Google Android Developers (2026) کے مطابق، ٹاپ 100 میں سے 89% Android ایپس میں Property Animation استعمال ہوتی ہے۔ اینیمیشن کی دیگر اقسام کے بارے میں مزید جاننے کے لیے جنرل اینیمیشن گائیڈ دیکھیں۔
اہم نکات
Property Animation Android SDK (android.animation پیکیج) میں ایک فریم ورک ہے جو کسی بھی شے (View، Drawable، کسٹم کلاس) کی کسی بھی خصوصیت کو مخصوص وقت میں اینیمیٹ کرتا ہے۔ View Animation کے برعکس، جو صرف View کے ساتھ کام کرتی ہے اور صرف بصری نمائندگی (میٹرکس ٹرانسفارم) تبدیل کرتی ہے، Property Animation شے کے حقیقی فیلڈز کو تبدیل کرتی ہے۔ اس کا مطلب ہے کہ translationX اینیمیشن کے بعد، شے حقیقت میں نئی پوزیشن پر ہوتی ہے اور کلکس نئی جگہ پر پروسیس ہوتے ہیں۔
Property Animation کا فن تعمیر تین اہم کلاسوں پر مبنی ہے: ValueAnimator — بنیادی ویلیو جنریٹر، ObjectAnimator — شے کی خصوصیت سے منسلک ہونے کے لیے ذیلی کلاس، AnimatorSet — گروپ اینیمیشن کے لیے آرکیسٹریٹر۔ تینوں Interpolator (رفتار کا منحنی) اور TypeEvaluator (اقدار کے درمیان انٹرپولیشن کا قاعدہ) کو سپورٹ کرتی ہیں۔
Android Performance Patterns (Google، 2025) کے مطابق، Property Animation مناسب طریقے سے ترتیب دیے گئے Interpolator اور onAnimationUpdate() میں بھاری حسابات کے بغیر 60 FPS تک چلتی ہے۔ پیچیدہ اینیمیشن (3D، فزکس) کے لیے، Android 12+ میں RenderThread (RenderNode Animations) تجویز کیا جاتا ہے۔ Property Animation View کی خصوصیات — translationX، rotationY، scaleX، alpha اور دیگر — کو اینیمیٹ کرنے کے لیے بنیادی انتخاب بنی ہوئی ہے۔
ObjectAnimator Property Animation کی سب سے مقبول کلاس ہے۔ یہ ValueAnimator کو بڑھاتا ہے اور اینیمیٹڈ اقدار کے ساتھ مخصوص شے کی خصوصیت کے setter کو خود بخود کال کرتا ہے۔ ObjectAnimator کے کام کرنے کے لیے، شے کے پاس اینیمیٹ کی جانے والی خصوصیت کے لیے ایک عوامی setter ہونا چاہیے (مثال کے طور پر، “translationX” خصوصیت کے لیے setTranslationX(float))۔
import android.animation.ObjectAnimator
import android.view.View
// ObjectAnimator for 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() کسٹم اقسام (رنگ، نقطہ) کے لیے استعمال ہوتا ہے۔ رنگ کی اینیمیشن کے لیے، ArgbEvaluator یا HsvEvaluator کے ساتھ ofObject() استعمال کریں۔
// 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 سے شروع کرتے ہوئے، suspendAnimationFrame کے ذریعے coroutine سپورٹ کے ساتھ Animator.AnimationCallback شامل کیا گیا ہے۔
ValueAnimator Property Animation کی بنیادی کلاس ہے جو ایک مقررہ مدت میں شروع سے آخر تک اینیمیٹڈ اقدار پیدا کرتی ہے۔ 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() — ایک ٹائمر کے ساتھ متعدد خصوصیات کے متوازی اینیمیشن کے لیے، ہر خصوصیت کے لیے علیحدہ Animators کے مقابلے میں وسائل بچاتا ہے۔
// 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() کال کرنا، بھاری حسابات (فائل I/O، نیٹ ورک)۔ 20+ عناصر کو بیک وقت اینیمیٹ کرنے کے لیے، 20 علیحدہ Animators کے بجائے ایک Animator میں PropertyValuesHolder استعمال کریں۔ سائز تبدیل کرنے والے اینیمیشن کے لیے، اینیمیشن کے آخر میں صرف View.setLayoutParams() استعمال کریں (AnimatorListenerAdapter.onAnimationEnd کے ذریعے)۔
AnimatorSet ایک آرکیسٹریٹر ہے جو ایک سے زیادہ Animator (ObjectAnimator، ValueAnimator) مثالوں کو ایک مخصوص ترتیب میں چلانے کی اجازت دیتا ہے: ترتیب وار (playSequentially)، متوازی (playTogether)، تاخیر کے ساتھ (after، before، with)۔ AnimatorSet nesting کو سپورٹ کرتا ہے — پیچیدہ منظرناموں کے لیے ایک AnimatorSet دوسرے AnimatorSets پر مشتمل ہو سکتا ہے۔
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)
"> بعد: 200ms تاخیر کے ساتھ 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 زنجیریں بنانے کے لیے ایک فلوئنٹ 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) طریقہ کے ساتھ ایک انٹرفیس جو شروع اور آخر کے درمیان درمیانی قدر کا حساب لگاتا ہے۔ بلٹ ان: ArgbEvaluator (int رنگ)، FloatEvaluator، IntEvaluator، PointFEvaluator، RectEvaluator۔ کسٹم ڈیٹا اقسام کے لیے (مثال کے طور پر، تین فیلڈز والی کسٹم کلاس کو اینیمیٹ کرنا)، اپنا خود کا TypeEvaluator نافذ کریں۔ ایک ہی سیٹنگز کے ساتھ ایک سے زیادہ Views کو اینیمیٹ کرنے کے لیے، PropertyValuesHolder استعمال کریں — یہ پراپرٹی ناموں اور متعلقہ اقدار کی ایک صف قبول کرتا ہے۔
// ProgressState کلاس کے لیے کسٹم TypeEvaluator
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 کی بصری نمائندگی کو تبدیل کرتی ہے، شے کی حقیقی خصوصیات کو متاثر کیے بغیر۔ View Animation میں translationX اینیمیشن کے بعد، عنصر بصری طور پر منتقل ہو جاتا ہے، لیکن کلکس اب بھی اصل پوزیشن پر پروسیس ہوتے ہیں۔ Property Animation (ObjectAnimator) حقیقی خصوصیت کو تبدیل کرتی ہے — اینیمیشن کے بعد، عنصر جسمانی طور پر نئی پوزیشن پر ہوتا ہے۔
animator.cancel() کال کریں — اینیمیشن فوراً رک جاتی ہے، حتمی قدر لاگو نہیں ہوتی۔ animator.end() کال کرنا — اینیمیشن حتمی حالت میں چلی جاتی ہے اور رک جاتی ہے۔ AnimatorSet کے لیے — set.cancel() سیٹ میں تمام اینیمیشن روک دیتا ہے۔ Animator.pause() اور resume() عارضی روک کے لیے API 19+ پر دستیاب ہیں۔
Material Design تجویز کرتا ہے: FastOutSlowInInterpolator — عناصر کے ظاہر اور غائب ہونے والی اینیمیشن کے لیے، LinearInterpolator — لوڈنگ انڈیکیٹرز کے لیے، OvershootInterpolator — زور دار اثرات (بٹن) کے لیے، BounceInterpolator — پل ٹو رفریش اور اسپرنگ عناصر کے لیے۔ اسکرین سے باہر سے ظاہر ہونے والی اینیمیشن کے لیے، AccelerateDecelerateInterpolator استعمال کریں۔
چیک کریں: (1) شے کے پاس مخصوص خصوصیت کے لیے عوامی setter ہے (setPropertyName())، (2) خصوصیت “set” کے بعد چھوٹے حرف کے ساتھ camelCase میں لکھی گئی ہے، (3) setter وہی قسم قبول کرتا ہے جو آپ دے رہے ہیں (ofFloat → setPropertyName(float))۔ View کے لیے، تمام معیاری خصوصیات (alpha، translationX، rotation وغیرہ) کے setter ہوتے ہیں۔
ObjectAnimator — جب آپ ایک معیاری View خصوصیت (alpha، translationX، rotation) کو اینیمیٹ کر رہے ہوں۔ ValueAnimator — جب آپ کو ایک سننے والے سے متعدد خصوصیات کو اپ ڈیٹ کرنے، غیر View خصوصیات (پیش رفت، کسٹم ڈرائنگ) کو اینیمیٹ کرنے، یا جب شے کے پاس مطلوبہ خصوصیت کے لیے setter نہ ہو۔ ValueAnimator زیادہ لچکدار ہے لیکن دستی اپ ڈیٹس کے لیے مزید کوڈ کی ضرورت ہے۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں