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-এর সাথে কাজ করে এবং শুধু ভিজুয়াল উপস্থাপনা (matrix transform) পরিবর্তন করে, Property Animation অবজেক্টের প্রকৃত ফিল্ড পরিবর্তন করে। এর মানে হল যে translationX অ্যানিমেশনের পরে, অবজেক্টটি আসলে নতুন অবস্থানে থাকে এবং ক্লিক নতুন স্থানে প্রক্রিয়া করা হয়।
Property Animation আর্কিটেকচার তিনটি মূল ক্লাসের উপর নির্মিত: ValueAnimator — বেস ভ্যালু জেনারেটর, ObjectAnimatorAnimatorSet
— গ্রুপ অ্যানিমেশনের জন্য অর্কেস্ট্রেটর। তিনটিই 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 নেস্টিং সমর্থন করে — একটি 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 চেইন তৈরির জন্য একটি 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) মেথড সহ একটি ইন্টারফেস যা শুরু এবং শেষের মধ্যে মধ্যবর্তী মান গণনা করে। বিল্ট-ইন: 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, ইত্যাদি) setters আছে।
ObjectAnimator — যখন আপনি একটি একক স্ট্যান্ডার্ড View বৈশিষ্ট্য (alpha, translationX, rotation) অ্যানিমেট করছেন। ValueAnimator — যখন আপনি একটি শ্রোতা থেকে একাধিক বৈশিষ্ট্য আপডেট করতে, অ-View বৈশিষ্ট্য (প্রগতি, কাস্টম ড্রইং) অ্যানিমেট করতে, বা যখন অবজেক্টের প্রয়োজনীয় বৈশিষ্ট্যের জন্য setter নেই। ValueAnimator আরও নমনীয় কিন্তু ম্যানুয়াল আপডেটের জন্য আরও কোড প্রয়োজন।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন