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) অনুযায়ী, শীর্ষ 100-এর 89% Android অ্যাপে Property Animation ব্যবহৃত হয়। অন্যান্য ধরনের অ্যানিমেশন সম্পর্কে আরও জানতে সাধারণ অ্যানিমেশন গাইড দেখুন।

মূল পয়েন্ট

  • Property Animation — Animator-এর মাধ্যমে অবজেক্টের বৈশিষ্ট্য পরিবর্তনের জন্য Android অ্যানিমেশন সিস্টেম।
  • 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 — বেস ভ্যালু জেনারেটর, 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: অবজেক্টের বৈশিষ্ট্যের অ্যানিমেশন

ObjectAnimator হল Property Animation-এর সবচেয়ে জনপ্রিয় ক্লাস। এটি ValueAnimator-কে প্রসারিত করে এবং অ্যানিমেটেড মান সহ নির্দিষ্ট অবজেক্টের বৈশিষ্ট্যের setter-কে স্বয়ংক্রিয়ভাবে কল করে। ObjectAnimator কাজ করার জন্য, অবজেক্টের অ্যানিমেট করা বৈশিষ্ট্যের জন্য একটি পাবলিক setter থাকতে হবে (যেমন, "translationX" বৈশিষ্ট্যের জন্য setTranslationX(float))।

kotlin
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() ব্যবহার করুন।

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 থেকে শুরু করে, suspendAnimationFrame-এর মাধ্যমে coroutine সমর্থন সহ Animator.AnimationCallback যুক্ত করা হয়েছে।

ValueAnimator: অ্যানিমেটেড মান তৈরি করা

ValueAnimator হল Property Animation-এর বেস ক্লাস যা একটি নির্দিষ্ট সময়ে শুরু থেকে শেষ পর্যন্ত অ্যানিমেটেড মান তৈরি করে। 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() — একটি টাইমারের সাথে একাধিক বৈশিষ্ট্যের সমান্তরাল অ্যানিমেশনের জন্য, প্রতিটি বৈশিষ্ট্যের জন্য পৃথক Animators-এর তুলনায় সম্পদ সাশ্রয় করে।

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() কল করা, ভারী গণনা (ফাইল I/O, নেটওয়ার্ক)। 20+ একসঙ্গে এলিমেন্ট অ্যানিমেট করতে, 20টি পৃথক Animators-এর পরিবর্তে একটি Animator-এ PropertyValuesHolder ব্যবহার করুন। আকার পরিবর্তনকারী অ্যানিমেশনের জন্য, শুধু অ্যানিমেশনের শেষে View.setLayoutParams() ব্যবহার করুন (AnimatorListenerAdapter.onAnimationEnd-এর মাধ্যমে)।

AnimatorSet: অ্যানিমেশন কম্পোজিশন

AnimatorSet হল একটি অর্কেস্ট্রেটর যা একটি নির্দিষ্ট ক্রমে একাধিক Animator (ObjectAnimator, ValueAnimator) ইনস্ট্যান্স চালানোর অনুমতি দেয়: ক্রমানুসারে (playSequentially), সমান্তরালে (playTogether), বিলম্ব সহ (after, before, with)। AnimatorSet নেস্টিং সমর্থন করে — একটি AnimatorSet জটিল পরিস্থিতির জন্য অন্যান্য AnimatorSets ধারণ করতে পারে।

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)
    "> পরে: 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 এবং 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) মেথড সহ একটি ইন্টারফেস যা শুরু এবং শেষের মধ্যে মধ্যবর্তী মান গণনা করে। বিল্ট-ইন: ArgbEvaluator (int রং), FloatEvaluator, IntEvaluator, PointFEvaluator, RectEvaluator। কাস্টম ডেটা প্রকারের জন্য (যেমন, তিনটি ফিল্ড সহ একটি কাস্টম ক্লাস অ্যানিমেট করা), আপনার নিজস্ব TypeEvaluator বাস্তবায়ন করুন। একই সেটিংস সহ একাধিক Views অ্যানিমেট করতে, PropertyValuesHolder ব্যবহার করুন — এটি প্রপার্টির নাম এবং সংশ্লিষ্ট মানগুলির একটি অ্যারে গ্রহণ করে।

kotlin
// 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()
}

সচরাচর জিজ্ঞাসিত প্রশ্ন

Property Animation কীভাবে View Animation থেকে আলাদা?

View Animation (Tween Animation) একটি ম্যাট্রিক্স রূপান্তরের মাধ্যমে শুধু View-এর ভিজুয়াল উপস্থাপনা পরিবর্তন করে, অবজেক্টের প্রকৃত বৈশিষ্ট্যকে প্রভাবিত না করে। View Animation-এ translationX অ্যানিমেশনের পরে, উপাদানটি দৃশ্যত স্থানান্তরিত হয়, কিন্তু ক্লিকগুলি এখনও মূল অবস্থানে প্রক্রিয়া করা হয়। Property Animation (ObjectAnimator) প্রকৃত বৈশিষ্ট্য পরিবর্তন করে — অ্যানিমেশনের পরে, উপাদানটি শারীরিকভাবে নতুন অবস্থানে থাকে।

কীভাবে Property Animation বন্ধ করবেন?

animator.cancel() কল করুন — অ্যানিমেশন অবিলম্বে বন্ধ হয়, চূড়ান্ত মান প্রয়োগ করা হয় না। animator.end() কল করা — অ্যানিমেশন চূড়ান্ত অবস্থায় যায় এবং বন্ধ হয়। AnimatorSet-এর জন্য — set.cancel() সেটের সমস্ত অ্যানিমেশন বন্ধ করে দেয়। Animator.pause() এবং resume() অস্থায়ী বিরতির জন্য API 19+-এ উপলব্ধ।

বিভিন্ন ধরনের অ্যানিমেশনের জন্য কোন Interpolator ব্যবহার করবেন?

Material Design সুপারিশ করে: FastOutSlowInInterpolator — উপাদান দেখা ও অদৃশ্য হওয়ার অ্যানিমেশনের জন্য, LinearInterpolator — লোডিং ইন্ডিকেটরের জন্য, OvershootInterpolator — অ্যাকসেন্ট ইফেক্টের (বাটন) জন্য, BounceInterpolator — পুল-টু-রিফ্রেশ এবং স্প্রিং উপাদানের জন্য। স্ক্রিনের বাইরে থেকে আসা অ্যানিমেশনের জন্য, AccelerateDecelerateInterpolator ব্যবহার করুন।

কেন ObjectAnimator বৈশিষ্ট্যটি অ্যানিমেট করছে না?

পরীক্ষা করুন: (1) অবজেক্টের নির্দিষ্ট বৈশিষ্ট্যের জন্য একটি পাবলিক setter আছে (setPropertyName()), (2) বৈশিষ্ট্যটি "set"-এর পরে ছোট হাতের অক্ষর সহ camelCase-এ লেখা হয়েছে, (3) setter আপনি যে টাইপ পাস করছেন তা গ্রহণ করে (ofFloat → setPropertyName(float))। View-এর জন্য, সমস্ত স্ট্যান্ডার্ড বৈশিষ্ট্যের (alpha, translationX, rotation, ইত্যাদি) setters আছে।

কখন ValueAnimator-এর পরিবর্তে ObjectAnimator ব্যবহার করবেন?

ObjectAnimator — যখন আপনি একটি একক স্ট্যান্ডার্ড View বৈশিষ্ট্য (alpha, translationX, rotation) অ্যানিমেট করছেন। ValueAnimator — যখন আপনি একটি শ্রোতা থেকে একাধিক বৈশিষ্ট্য আপডেট করতে, অ-View বৈশিষ্ট্য (প্রগতি, কাস্টম ড্রইং) অ্যানিমেট করতে, বা যখন অবজেক্টের প্রয়োজনীয় বৈশিষ্ট্যের জন্য setter নেই। ValueAnimator আরও নমনীয় কিন্তু ম্যানুয়াল আপডেটের জন্য আরও কোড প্রয়োজন।

সারসংক্ষেপ

  • Property Animation — Animator-এর মাধ্যমে বাস্তব অবজেক্টের বৈশিষ্ট্য অ্যানিমেট করার জন্য Android ফ্রেমওয়ার্ক।
  • ObjectAnimator — নির্দিষ্ট শুরু/শেষ মান সহ একটি নির্দিষ্ট অবজেক্টের বৈশিষ্ট্যের অ্যানিমেশন।
  • ValueAnimator — onAnimationUpdate-এ ম্যানুয়াল আপডেট সহ অ্যানিমেটেড মান উৎপাদন।
  • AnimatorSet — ক্রমানুসারে বা সমান্তরালে একাধিক অ্যানিমেটরের অর্কেস্ট্রেশন।
  • Interpolator — গতি বক্ররেখা: FastOutSlowIn, Linear, Bounce, Overshoot, কাস্টম।
  • TypeEvaluator — কাস্টম ডেটা প্রকারের জন্য মানের মধ্যে ইন্টারপোলেশন নিয়ম।
  • Property Values Holder (PropertyValuesHolder) — একাধিক বৈশিষ্ট্যের সমান্তরাল অ্যানিমেশনের জন্য অপ্টিমাইজেশন।

আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব

IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।

প্রকল্প নিয়ে আলোচনা করুন

আরও পড়ুন