স্প্রিং ফিজিক্স ব্যবহার করে অ্যানিমেট আন্দোলন

কম্পোজ পদ্ধতিটি চেষ্টা করুন
জেটপ্যাক কম্পোজ অ্যান্ড্রয়েডের জন্য প্রস্তাবিত UI টুলকিট। কম্পোজে কীভাবে অ্যানিমেশন ব্যবহার করতে হয় তা জানুন।

পদার্থবিদ্যা-ভিত্তিক গতি বল দ্বারা চালিত হয়। স্প্রিং বল এমনই একটি বল যা মিথস্ক্রিয়া এবং গতিকে পরিচালিত করে। একটি স্প্রিং বলের নিম্নলিখিত বৈশিষ্ট্য রয়েছে: অবমন্দন এবং দৃঢ়তা। একটি স্প্রিং-ভিত্তিক অ্যানিমেশনে, প্রতিটি ফ্রেমে প্রয়োগ করা স্প্রিং বলের উপর ভিত্তি করে এর মান এবং বেগ গণনা করা হয়।

আপনি যদি চান আপনার অ্যাপের অ্যানিমেশনগুলো শুধু এক দিকে ধীর হোক, তাহলে এর পরিবর্তে একটি ঘর্ষণ-ভিত্তিক ফ্লিং অ্যানিমেশন ব্যবহার করার কথা বিবেচনা করতে পারেন।

একটি স্প্রিং অ্যানিমেশনের জীবনচক্র

স্প্রিং-ভিত্তিক অ্যানিমেশনে, SpringForce ক্লাসটি আপনাকে স্প্রিং-এর দৃঢ়তা, এর ড্যাম্পিং অনুপাত এবং এর চূড়ান্ত অবস্থান কাস্টমাইজ করার সুযোগ দেয়। অ্যানিমেশন শুরু হওয়ার সাথে সাথেই, স্প্রিং ফোর্স প্রতিটি ফ্রেমে অ্যানিমেশনের মান এবং বেগ আপডেট করে। স্প্রিং ফোর্স সাম্যাবস্থায় না পৌঁছানো পর্যন্ত অ্যানিমেশনটি চলতে থাকে।

উদাহরণস্বরূপ, আপনি যদি স্ক্রিনে কোনো অ্যাপ আইকন টেনে নিয়ে যান এবং পরে আইকনটি থেকে আঙুল তুলে ছেড়ে দেন, তাহলে একটি অদৃশ্য কিন্তু পরিচিত শক্তির টানে আইকনটি তার আসল জায়গায় ফিরে আসে।

চিত্র ১-এ একটি অনুরূপ স্প্রিং প্রভাব দেখানো হয়েছে। বৃত্তের মাঝখানে থাকা প্লাস চিহ্ন (+) চিহ্নটি স্পর্শের মাধ্যমে প্রয়োগ করা বল নির্দেশ করে।

বসন্তকালীন মুক্তি
চিত্র ১. স্প্রিং মুক্তির প্রভাব

একটি স্প্রিং অ্যানিমেশন তৈরি করুন

আপনার অ্যাপ্লিকেশনের জন্য একটি স্প্রিং অ্যানিমেশন তৈরি করার সাধারণ ধাপগুলো নিম্নরূপ:

নিম্নলিখিত বিভাগগুলিতে একটি স্প্রিং অ্যানিমেশন তৈরির সাধারণ ধাপগুলি বিস্তারিতভাবে আলোচনা করা হয়েছে।

সাপোর্ট লাইব্রেরি যোগ করুন

পদার্থবিদ্যা-ভিত্তিক সাপোর্ট লাইব্রেরিটি ব্যবহার করার জন্য, আপনাকে নিম্নলিখিতভাবে আপনার প্রজেক্টে সাপোর্ট লাইব্রেরিটি যুক্ত করতে হবে:

  1. আপনার অ্যাপ মডিউলের build.gradle ফাইলটি খুলুন।
  2. dependencies সেকশনে সাপোর্ট লাইব্রেরিটি যোগ করুন।

    গ্রুভি

            dependencies {
                def dynamicanimation_version = '1.0.0'
                implementation "androidx.dynamicanimation:dynamicanimation:$dynamicanimation_version"
            }
            

    কোটলিন

            dependencies {
                val dynamicanimation_version = "1.0.0"
                implementation("androidx.dynamicanimation:dynamicanimation:$dynamicanimation_version")
            }
            

    এই লাইব্রেরির বর্তমান সংস্করণগুলো দেখতে, সংস্করণ পৃষ্ঠায় Dynamicanimation সম্পর্কিত তথ্য দেখুন।

একটি বসন্তের অ্যানিমেশন তৈরি করুন

SpringAnimation ক্লাসটি আপনাকে কোনো অবজেক্টের জন্য স্প্রিং অ্যানিমেশন তৈরি করতে দেয়। একটি স্প্রিং অ্যানিমেশন তৈরি করতে, আপনাকে SpringAnimation ক্লাসের একটি ইনস্ট্যান্স তৈরি করতে হবে এবং একটি অবজেক্ট, অবজেক্টের যে প্রপার্টিটি আপনি অ্যানিমেট করতে চান সেটি, এবং ঐচ্ছিকভাবে একটি চূড়ান্ত স্প্রিং পজিশন প্রদান করতে হবে যেখানে আপনি অ্যানিমেশনটি শেষ করতে চান।

দ্রষ্টব্য: স্প্রিং অ্যানিমেশন তৈরি করার সময় স্প্রিং-এর চূড়ান্ত অবস্থান ঐচ্ছিক। তবে, অ্যানিমেশন শুরু করার আগে এটি অবশ্যই নির্ধারণ করতে হবে।

কোটলিন

val springAnim = findViewById<View>(R.id.imageView).let { img ->
    // Setting up a spring animation to animate the view’s translationY property with the final
    // spring position at 0.
    SpringAnimation(img, DynamicAnimation.TRANSLATION_Y, 0f)
}

জাভা

final View img = findViewById(R.id.imageView);
// Setting up a spring animation to animate the view’s translationY property with the final
// spring position at 0.
final SpringAnimation springAnim = new SpringAnimation(img, DynamicAnimation.TRANSLATION_Y, 0);

স্প্রিং-ভিত্তিক অ্যানিমেশন ভিউ অবজেক্টের অ্যাকচুয়াল প্রোপার্টি পরিবর্তন করার মাধ্যমে স্ক্রিনের ভিউগুলোকে অ্যানিমেট করতে পারে। সিস্টেমে নিম্নলিখিত ভিউগুলো উপলব্ধ আছে:

  • ALPHA : ভিউটির আলফা স্বচ্ছতা নির্দেশ করে। এর ডিফল্ট মান হলো ১ (অস্বচ্ছ), এবং ০ মানটি সম্পূর্ণ স্বচ্ছতা (অদৃশ্য) বোঝায়।
  • TRANSLATION_X , TRANSLATION_Y , এবং TRANSLATION_Z : এই প্রোপার্টিগুলো নিয়ন্ত্রণ করে যে ভিউটি তার লেআউট কন্টেইনার দ্বারা নির্ধারিত বাম স্থানাঙ্ক, শীর্ষ স্থানাঙ্ক এবং উচ্চতা থেকে ডেল্টা হিসাবে কোথায় অবস্থিত।
    • TRANSLATION_X বাম স্থানাঙ্ক বর্ণনা করে।
    • TRANSLATION_Y শীর্ষ স্থানাঙ্কটি বর্ণনা করে।
    • TRANSLATION_Z দৃশ্যটির উচ্চতার সাপেক্ষে এর গভীরতা বর্ণনা করে।
  • ROTATION , ROTATION_X , এবং ROTATION_Y : এই প্রোপার্টিগুলো পিভট পয়েন্টের চারপাশে 2D ( rotation প্রোপার্টি) এবং 3D ঘূর্ণন নিয়ন্ত্রণ করে।
  • SCROLL_X এবং SCROLL_Y : এই প্রোপার্টিগুলো পিক্সেল-এ সোর্স লেফট এবং টপ এজ-এর স্ক্রল অফসেট নির্দেশ করে। এটি পেজটি কতটুকু স্ক্রল করা হয়েছে, সেই অবস্থানও নির্দেশ করে।
  • SCALE_X এবং SCALE_Y : এই প্রোপার্টিগুলো কোনো ভিউয়ের পিভট পয়েন্টকে কেন্দ্র করে তার দ্বি-মাত্রিক স্কেলিং নিয়ন্ত্রণ করে।
  • X , Y , এবং Z : এগুলো হলো মৌলিক ইউটিলিটি প্রোপার্টি, যা কন্টেইনারের মধ্যে ভিউটির চূড়ান্ত অবস্থান বর্ণনা করে।
    • X হলো বাম দিকের মান এবং TRANSLATION_X যোগফল।
    • Y হলো শীর্ষ মান এবং TRANSLATION_Y এর যোগফল।
    • Z হলো উচ্চতার মান এবং TRANSLATION_Z এর যোগফল।

শ্রোতাদের নিবন্ধন করুন

DynamicAnimation ক্লাসটি দুটি লিসেনার প্রদান করে: OnAnimationUpdateListener এবং OnAnimationEndListener । এই লিসেনারগুলো অ্যানিমেশনের আপডেটগুলো শোনে, যেমন—যখন অ্যানিমেশনের মানে কোনো পরিবর্তন আসে এবং যখন অ্যানিমেশনটি শেষ হয়।

OnAnimationUpdateListener

যখন আপনি একটি চেইনড অ্যানিমেশন তৈরি করতে একাধিক ভিউকে অ্যানিমেট করতে চান, তখন বর্তমান ভিউ-এর প্রপার্টিতে কোনো পরিবর্তন হলেই একটি কলব্যাক গ্রহণ করার জন্য আপনি OnAnimationUpdateListener সেট আপ করতে পারেন। এই কলব্যাকটি বর্তমান ভিউ-এর প্রপার্টিতে ঘটা পরিবর্তনের উপর ভিত্তি করে অন্য ভিউকে তার স্প্রিং পজিশন আপডেট করার জন্য অবহিত করে। লিসেনারটি রেজিস্টার করতে, নিম্নলিখিত ধাপগুলি অনুসরণ করুন:

  1. addUpdateListener() মেথডটি কল করুন এবং লিসেনারটিকে অ্যানিমেশনের সাথে সংযুক্ত করুন।

    দ্রষ্টব্য: অ্যানিমেশন শুরু হওয়ার আগে আপনাকে আপডেট লিসেনারটি রেজিস্টার করতে হবে। তবে, আপডেট লিসেনারটি কেবল তখনই রেজিস্টার করা উচিত, যদি অ্যানিমেশনের মান পরিবর্তনের ক্ষেত্রে প্রতি-ফ্রেমে আপডেটের প্রয়োজন হয়। একটি আপডেট লিসেনার অ্যানিমেশনকে সম্ভাব্য একটি পৃথক থ্রেডে চলার হাত থেকে রক্ষা করে।

  2. বর্তমান অবজেক্টের পরিবর্তন সম্পর্কে কলারকে অবহিত করতে onAnimationUpdate() মেথডটি ওভাররাইড করুন। নিম্নলিখিত নমুনা কোডটি OnAnimationUpdateListener এর সার্বিক ব্যবহার তুলে ধরে।

কোটলিন

// Setting up a spring animation to animate the view1 and view2 translationX and translationY properties
val (anim1X, anim1Y) = findViewById<View>(R.id.view1).let { view1 ->
    SpringAnimation(view1, DynamicAnimation.TRANSLATION_X) to
            SpringAnimation(view1, DynamicAnimation.TRANSLATION_Y)
}
val (anim2X, anim2Y) = findViewById<View>(R.id.view2).let { view2 ->
    SpringAnimation(view2, DynamicAnimation.TRANSLATION_X) to
            SpringAnimation(view2, DynamicAnimation.TRANSLATION_Y)
}

// Registering the update listener
anim1X.addUpdateListener { _, value, _ ->
    // Overriding the method to notify view2 about the change in the view1’s property.
    anim2X.animateToFinalPosition(value)
}

anim1Y.addUpdateListener { _, value, _ -> anim2Y.animateToFinalPosition(value) }

জাভা

// Creating two views to demonstrate the registration of the update listener.
final View view1 = findViewById(R.id.view1);
final View view2 = findViewById(R.id.view2);

// Setting up a spring animation to animate the view1 and view2 translationX and translationY properties
final SpringAnimation anim1X = new SpringAnimation(view1,
        DynamicAnimation.TRANSLATION_X);
final SpringAnimation anim1Y = new SpringAnimation(view1,
    DynamicAnimation.TRANSLATION_Y);
final SpringAnimation anim2X = new SpringAnimation(view2,
        DynamicAnimation.TRANSLATION_X);
final SpringAnimation anim2Y = new SpringAnimation(view2,
        DynamicAnimation.TRANSLATION_Y);

// Registering the update listener
anim1X.addUpdateListener(new DynamicAnimation.OnAnimationUpdateListener() {

// Overriding the method to notify view2 about the change in the view1’s property.
    @Override
    public void onAnimationUpdate(DynamicAnimation dynamicAnimation, float value,
                                  float velocity) {
        anim2X.animateToFinalPosition(value);
    }
});

anim1Y.addUpdateListener(new DynamicAnimation.OnAnimationUpdateListener() {

  @Override
    public void onAnimationUpdate(DynamicAnimation dynamicAnimation, float value,
                                  float velocity) {
        anim2Y.animateToFinalPosition(value);
    }
});

OnAnimationEndListener

OnAnimationEndListener একটি অ্যানিমেশনের সমাপ্তি সম্পর্কে অবহিত করে। অ্যানিমেশনটি সাম্যাবস্থায় পৌঁছালে বা বাতিল করা হলে কলব্যাক পাওয়ার জন্য আপনি লিসেনারটি সেট আপ করতে পারেন। লিসেনারটি রেজিস্টার করতে, নিম্নলিখিত ধাপগুলি অনুসরণ করুন:

  1. addEndListener() মেথডটি কল করুন এবং লিসেনারটিকে অ্যানিমেশনের সাথে সংযুক্ত করুন।
  2. যখনই কোনো অ্যানিমেশন সাম্যাবস্থায় পৌঁছায় বা বাতিল করা হয়, তখন নোটিফিকেশন পাওয়ার জন্য onAnimationEnd() মেথডটি ওভাররাইড করুন।

শ্রোতাদের অপসারণ করুন

অ্যানিমেশন আপডেট কলব্যাক এবং অ্যানিমেশন শেষ কলব্যাক গ্রহণ করা বন্ধ করতে, যথাক্রমে removeUpdateListener() এবং removeEndListener() মেথডগুলো কল করুন।

অ্যানিমেশন শুরুর মান সেট করুন

অ্যানিমেশনের শুরুর মান সেট করতে, setStartValue() মেথডটি কল করুন এবং অ্যানিমেশনের শুরুর মানটি পাস করুন। যদি আপনি শুরুর মান সেট না করেন, তাহলে অ্যানিমেশনটি অবজেক্টের প্রপার্টির বর্তমান মানকে শুরুর মান হিসেবে ব্যবহার করবে।

অ্যানিমেশন মানের পরিসীমা সেট করুন

যখন আপনি কোনো প্রপার্টির মানকে একটি নির্দিষ্ট পরিসরের মধ্যে সীমাবদ্ধ রাখতে চান, তখন আপনি সর্বনিম্ন এবং সর্বোচ্চ অ্যানিমেশন মান নির্ধারণ করতে পারেন। এটি সেইসব প্রপার্টি অ্যানিমেট করার ক্ষেত্রেও পরিসর নিয়ন্ত্রণ করতে সাহায্য করে, যেগুলোর একটি অন্তর্নিহিত পরিসর রয়েছে, যেমন আলফা (০ থেকে ১)।

  • সর্বনিম্ন মান নির্ধারণ করতে, setMinValue() মেথডটি কল করুন এবং প্রপার্টির সর্বনিম্ন মানটি পাস করুন।
  • সর্বোচ্চ মান নির্ধারণ করতে, setMaxValue() মেথডটি কল করুন এবং প্রপার্টির সর্বোচ্চ মানটি পাস করুন।

উভয় পদ্ধতিই সেই অ্যানিমেশনটি রিটার্ন করে, যার জন্য মানটি সেট করা হচ্ছে।

দ্রষ্টব্য: যদি আপনি প্রারম্ভিক মান নির্ধারণ করে থাকেন এবং একটি অ্যানিমেশন মানের পরিসীমা সংজ্ঞায়িত করে থাকেন, তবে নিশ্চিত করুন যে প্রারম্ভিক মানটি সর্বনিম্ন এবং সর্বোচ্চ মানের পরিসীমার মধ্যে রয়েছে।

প্রারম্ভিক বেগ নির্ধারণ করুন

স্টার্ট ভেলোসিটি সেই গতিকে সংজ্ঞায়িত করে, যে গতিতে অ্যানিমেশনের শুরুতে অ্যানিমেশন প্রপার্টিটি পরিবর্তিত হয়। ডিফল্ট স্টার্ট ভেলোসিটি প্রতি সেকেন্ডে শূন্য পিক্সেলে সেট করা থাকে। আপনি টাচ জেসচারের ভেলোসিটি দিয়ে অথবা স্টার্ট ভেলোসিটি হিসেবে একটি নির্দিষ্ট মান ব্যবহার করে ভেলোসিটি সেট করতে পারেন। আপনি যদি একটি নির্দিষ্ট মান প্রদান করতে চান, তবে আমরা সুপারিশ করি যে মানটি প্রতি সেকেন্ডে dp-তে নির্ধারণ করুন এবং তারপরে এটিকে প্রতি সেকেন্ডে পিক্সেলে রূপান্তর করুন। প্রতি সেকেন্ডে dp-তে মান নির্ধারণ করলে ভেলোসিটি ডেনসিটি এবং ফর্ম ফ্যাক্টরের উপর নির্ভরশীল থাকে না। মানকে প্রতি সেকেন্ডে পিক্সেলে রূপান্তর করার বিষয়ে আরও তথ্যের জন্য, "প্রতি সেকেন্ডে dp থেকে প্রতি সেকেন্ডে পিক্সেলে রূপান্তর" বিভাগটি দেখুন।

বেগ নির্ধারণ করতে, setStartVelocity() মেথডটি কল করুন এবং পিক্সেল প্রতি সেকেন্ডে বেগটি পাস করুন। মেথডটি সেই স্প্রিং ফোর্স অবজেক্টটি রিটার্ন করে, যার উপর বেগটি নির্ধারণ করা হয়।

দ্রষ্টব্য: টাচ জেসচারের বেগ সংগ্রহ ও গণনা করার জন্য GestureDetector.OnGestureListener অথবা VelocityTracker ক্লাস মেথডগুলো ব্যবহার করুন।

কোটলিন

findViewById<View>(R.id.imageView).also { img ->
    SpringAnimation(img, DynamicAnimation.TRANSLATION_Y).apply {
        
        // Compute velocity in the unit pixel/second
        vt.computeCurrentVelocity(1000)
        val velocity = vt.yVelocity
        setStartVelocity(velocity)
    }
}

জাভা

final View img = findViewById(R.id.imageView);
final SpringAnimation anim = new SpringAnimation(img, DynamicAnimation.TRANSLATION_Y);

// Compute velocity in the unit pixel/second
vt.computeCurrentVelocity(1000);
float velocity = vt.getYVelocity();
anim.setStartVelocity(velocity);

ডিপি প্রতি সেকেন্ডকে পিক্সেল প্রতি সেকেন্ডে রূপান্তর করা

একটি স্প্রিং-এর বেগ অবশ্যই পিক্সেল প্রতি সেকেন্ডে হতে হবে। যদি আপনি বেগের শুরু হিসেবে একটি নির্দিষ্ট মান দিতে চান, তবে মানটি dp প্রতি সেকেন্ডে দিন এবং তারপর এটিকে পিক্সেল প্রতি সেকেন্ডে রূপান্তর করুন। রূপান্তরের জন্য, TypedValue ক্লাসের applyDimension() মেথডটি ব্যবহার করুন। নিচের নমুনা কোডটি দেখুন:

কোটলিন

val pixelPerSecond: Float =
    TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dpPerSecond, resources.displayMetrics)

জাভা

float pixelPerSecond = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dpPerSecond, getResources().getDisplayMetrics());

স্প্রিং বৈশিষ্ট্য সেট করুন

SpringForce ক্লাসটি স্প্রিং-এর প্রতিটি প্রোপার্টি, যেমন ড্যাম্পিং রেশিও এবং স্টিফনেস-এর জন্য গেটার এবং সেটার মেথড সংজ্ঞায়িত করে। স্প্রিং-এর প্রোপার্টিগুলো সেট করার জন্য, স্প্রিং ফোর্স অবজেক্টটি পুনরুদ্ধার করা অথবা একটি কাস্টম স্প্রিং ফোর্স তৈরি করা গুরুত্বপূর্ণ, যার উপর আপনি প্রোপার্টিগুলো সেট করতে পারবেন। কাস্টম স্প্রিং ফোর্স তৈরি করার বিষয়ে আরও তথ্যের জন্য, "ক্রিয়েটিং এ কাস্টম স্প্রিং ফোর্স" বিভাগটি দেখুন।

পরামর্শ: সেটার মেথডগুলো ব্যবহার করার সময় আপনি একটি মেথড চেইন তৈরি করতে পারেন, কারণ সব সেটার মেথডই স্প্রিং ফোর্স অবজেক্ট রিটার্ন করে।

অবমন্দন অনুপাত

অবমন্দন অনুপাত একটি স্প্রিংয়ের দোলনের ক্রমান্বয়িক হ্রাসকে বর্ণনা করে। অবমন্দন অনুপাত ব্যবহার করে, আপনি নির্ধারণ করতে পারেন যে এক দোলন থেকে পরবর্তী দোলনে দোলনগুলো কত দ্রুত হ্রাস পাবে। একটি স্প্রিংকে অবমন্দিত করার চারটি ভিন্ন উপায় রয়েছে:

  • অবমন্দন অনুপাত একের বেশি হলে অতি-অবমন্দন ঘটে। এর ফলে বস্তুটি ধীরে ধীরে তার স্থির অবস্থানে ফিরে আসে।
  • ক্রিটিক্যাল ড্যাম্পিং ঘটে যখন ড্যাম্পিং অনুপাত একের সমান হয়। এর ফলে বস্তুটি স্বল্পতম সময়ে তার স্থির অবস্থানে ফিরে আসতে পারে।
  • আন্ডারড্যাম্পিং ঘটে যখন ড্যাম্পিং অনুপাত একের চেয়ে কম হয়। এর ফলে বস্তুটি স্থির অবস্থানকে একাধিকবার অতিক্রম করে এবং তারপর ধীরে ধীরে স্থির অবস্থানে পৌঁছায়।
  • অবমন্দন অনুপাত শূন্য হলে তাকে অঅবমন্দন বলা হয়। এটি বস্তুটিকে অনির্দিষ্টকাল ধরে দুলতে দেয়।

স্প্রিং-এ ড্যাম্পিং রেশিও যোগ করতে, নিম্নলিখিত ধাপগুলো অনুসরণ করুন:

  1. ড্যাম্পিং রেশিও যোগ করার জন্য স্প্রিংটি পেতে getSpring() মেথডটি কল করুন।
  2. setDampingRatio() মেথডটি কল করুন এবং যে ড্যাম্পিং রেশিওটি আপনি স্প্রিং-এ যোগ করতে চান, তা পাস করুন। মেথডটি সেই স্প্রিং ফোর্স অবজেক্টটি রিটার্ন করে, যার উপর ড্যাম্পিং রেশিওটি সেট করা হয়।

    দ্রষ্টব্য: ড্যাম্পিং অনুপাত অবশ্যই একটি অঋণাত্মক সংখ্যা হতে হবে। যদি আপনি ড্যাম্পিং অনুপাত শূন্য নির্ধারণ করেন, তবে স্প্রিংটি কখনই তার স্থির অবস্থানে পৌঁছাবে না। অন্য কথায়, এটি অনন্তকাল ধরে দুলতে থাকবে।

সিস্টেমে নিম্নলিখিত ড্যাম্পিং অনুপাত ধ্রুবকগুলো উপলব্ধ আছে:

চিত্র ২: উচ্চ বাউন্স

চিত্র ৩: মাঝারি বাউন্স

চিত্র ৪: নিম্ন বাউন্স

চিত্র ৫: কোনো বাউন্স নেই

ডিফল্ট ড্যাম্পিং রেশিও DAMPING_RATIO_MEDIUM_BOUNCY তে সেট করা আছে।

কোটলিন

findViewById<View>(R.id.imageView).also { img ->
    SpringAnimation(img, DynamicAnimation.TRANSLATION_Y).apply {
        
        // Setting the damping ratio to create a low bouncing effect.
        spring.dampingRatio = SpringForce.DAMPING_RATIO_LOW_BOUNCY
        
    }
}

জাভা

final View img = findViewById(R.id.imageView);
final SpringAnimation anim = new SpringAnimation(img, DynamicAnimation.TRANSLATION_Y);

// Setting the damping ratio to create a low bouncing effect.
anim.getSpring().setDampingRatio(SpringForce.DAMPING_RATIO_LOW_BOUNCY);

দৃঢ়তা

দৃঢ়তা স্প্রিং ধ্রুবককে সংজ্ঞায়িত করে, যা স্প্রিংয়ের শক্তি পরিমাপ করে। একটি দৃঢ় স্প্রিং যখন স্থির অবস্থানে থাকে না, তখন এর সাথে সংযুক্ত বস্তুর উপর বেশি বল প্রয়োগ করে। স্প্রিংয়ের দৃঢ়তা বাড়াতে, নিম্নলিখিত ধাপগুলো অনুসরণ করুন:

  1. দৃঢ়তা যোগ করার জন্য স্প্রিংটি পেতে getSpring() মেথডটি কল করুন।
  2. setStiffness() মেথডটি কল করুন এবং স্প্রিং-এ যে স্টিফনেস ভ্যালুটি যোগ করতে চান তা পাস করুন। মেথডটি সেই স্প্রিং ফোর্স অবজেক্টটি রিটার্ন করে, যার উপর স্টিফনেস সেট করা হয়।

    দ্রষ্টব্য: দৃঢ়তা অবশ্যই একটি ধনাত্মক সংখ্যা হতে হবে।

সিস্টেমে নিম্নলিখিত দৃঢ়তা ধ্রুবকগুলো উপলব্ধ আছে:

চিত্র ৬: উচ্চ দৃঢ়তা

চিত্র ৭: মাঝারি দৃঢ়তা

চিত্র ৮: কম দৃঢ়তা

চিত্র ৯: অত্যন্ত কম দৃঢ়তা

ডিফল্ট দৃঢ়তা STIFFNESS_MEDIUM এ সেট করা আছে।

কোটলিন

findViewById<View>(R.id.imageView).also { img ->
    SpringAnimation(img, DynamicAnimation.TRANSLATION_Y).apply {
        
        // Setting the spring with a low stiffness.
        spring.stiffness = SpringForce.STIFFNESS_LOW
        
    }
}

জাভা

final View img = findViewById(R.id.imageView);
final SpringAnimation anim = new SpringAnimation(img, DynamicAnimation.TRANSLATION_Y);

// Setting the spring with a low stiffness.
anim.getSpring().setStiffness(SpringForce.STIFFNESS_LOW);

একটি কাস্টম স্প্রিং ফোর্স তৈরি করুন

ডিফল্ট স্প্রিং ফোর্স ব্যবহার করার বিকল্প হিসেবে আপনি একটি কাস্টম স্প্রিং ফোর্স তৈরি করতে পারেন। কাস্টম স্প্রিং ফোর্স আপনাকে একাধিক স্প্রিং অ্যানিমেশনে একই স্প্রিং ফোর্স ইনস্ট্যান্স শেয়ার করার সুযোগ দেয়। স্প্রিং ফোর্সটি তৈরি করার পর, আপনি ড্যাম্পিং রেশিও এবং স্টিফনেসের মতো প্রোপার্টিগুলো সেট করতে পারেন।

  1. একটি SpringForce অবজেক্ট তৈরি করুন।

    SpringForce force = new SpringForce();

  2. সংশ্লিষ্ট মেথডগুলো কল করে প্রোপার্টিগুলো নির্ধারণ করুন। আপনি একটি মেথড চেইনও তৈরি করতে পারেন।

    force.setDampingRatio(DAMPING_RATIO_LOW_BOUNCY).setStiffness(STIFFNESS_LOW);

  3. স্প্রিংটিকে অ্যানিমেশনে সেট করতে setSpring() মেথডটি কল করুন।

    setSpring(force);

অ্যানিমেশন শুরু করুন

স্প্রিং অ্যানিমেশন শুরু করার দুটি উপায় আছে: start() মেথড কল করে অথবা animateToFinalPosition() মেথড কল করে। উভয় মেথডই মেইন থ্রেডে কল করতে হয়।

animateToFinalPosition() মেথডটি দুটি কাজ সম্পাদন করে:

  • স্প্রিংটির চূড়ান্ত অবস্থান নির্ধারণ করে।
  • অ্যানিমেশনটি শুরু করে, যদি তা আগে থেকে শুরু না হয়ে থাকে।

যেহেতু এই মেথডটি স্প্রিং-এর চূড়ান্ত অবস্থান আপডেট করে এবং প্রয়োজনে অ্যানিমেশন শুরু করে, তাই আপনি যেকোনো সময় একটি অ্যানিমেশনের গতিপথ পরিবর্তন করতে এই মেথডটি কল করতে পারেন। উদাহরণস্বরূপ, একটি চেইনড স্প্রিং অ্যানিমেশনে, একটি ভিউ-এর অ্যানিমেশন অন্য একটি ভিউ-এর উপর নির্ভরশীল থাকে। এই ধরনের অ্যানিমেশনের জন্য, animateToFinalPosition() মেথডটি ব্যবহার করা বেশি সুবিধাজনক। একটি চেইনড স্প্রিং অ্যানিমেশনে এই মেথডটি ব্যবহার করলে, আপনি পরবর্তীতে যে অ্যানিমেশনটি আপডেট করতে চান সেটি বর্তমানে চলছে কি না, তা নিয়ে আপনাকে চিন্তা করতে হবে না।

চিত্র ১০-এ একটি চেইনড স্প্রিং অ্যানিমেশন দেখানো হয়েছে, যেখানে একটি ভিউয়ের অ্যানিমেশন অন্য একটি ভিউয়ের ওপর নির্ভরশীল।

চেইনড স্প্রিং ডেমো
চিত্র ১০। শৃঙ্খলিত স্প্রিং-এর প্রদর্শনী

animateToFinalPosition() মেথডটি ব্যবহার করতে হলে, animateToFinalPosition() কল করুন এবং স্প্রিংটির রেস্ট পজিশন পাস করুন। এছাড়াও, আপনি setFinalPosition() মেথডটি কল করে স্প্রিংটির রেস্ট পজিশন সেট করতে পারেন।

start() মেথডটি প্রপার্টির মানকে তাৎক্ষণিকভাবে প্রারম্ভিক মানে সেট করে না। প্রপার্টির মান প্রতিটি অ্যানিমেশন পালসে পরিবর্তিত হয়, যা ড্র পাসের আগে ঘটে। ফলে, এই পরিবর্তনগুলো পরবর্তী ফ্রেমে প্রতিফলিত হয়, যেন মানগুলো তাৎক্ষণিকভাবে সেট করা হয়েছে।

কোটলিন

findViewById<View>(R.id.imageView).also { img ->
    SpringAnimation(img, DynamicAnimation.TRANSLATION_Y).apply {
        
        // Starting the animation
        start()
        
    }
}

জাভা

final View img = findViewById(R.id.imageView);
final SpringAnimation anim = new SpringAnimation(img, DynamicAnimation.TRANSLATION_Y);

// Starting the animation
anim.start();

অ্যানিমেশন বাতিল করুন

আপনি অ্যানিমেশনটি বাতিল করতে পারেন অথবা এর শেষে চলে যেতে পারেন। অ্যানিমেশনটি বাতিল করা বা এর শেষে চলে যাওয়ার একটি আদর্শ পরিস্থিতি হলো যখন ব্যবহারকারীর কোনো কার্যকলাপের কারণে অ্যানিমেশনটি অবিলম্বে বন্ধ করার প্রয়োজন হয়। এটি বেশিরভাগ ক্ষেত্রে ঘটে যখন কোনো ব্যবহারকারী হঠাৎ করে অ্যাপ থেকে বেরিয়ে যান অথবা ভিউটি অদৃশ্য হয়ে যায়।

অ্যানিমেশন বন্ধ করার জন্য দুটি পদ্ধতি রয়েছে। cancel() পদ্ধতিটি অ্যানিমেশনটিকে তার বর্তমান মানে থামিয়ে দেয়। skipToEnd() পদ্ধতিটি অ্যানিমেশনটিকে সরাসরি শেষ মানে নিয়ে যায় এবং তারপর বন্ধ করে দেয়।

অ্যানিমেশনটি শেষ করার আগে, স্প্রিংটির অবস্থা প্রথমে পরীক্ষা করা জরুরি। যদি অবস্থাটি আনড্যাম্পড (undamped) হয়, তবে অ্যানিমেশনটি কখনোই স্থির অবস্থানে পৌঁছাতে পারবে না। স্প্রিংটির অবস্থা পরীক্ষা করার জন্য, canSkipToEnd() মেথডটি কল করুন। যদি স্প্রিংটি ড্যাম্পড (damped) হয়, তবে মেথডটি true রিটার্ন করে, অন্যথায় false

একবার স্প্রিং-এর অবস্থা জেনে গেলে, আপনি skipToEnd() অথবা cancel() মেথড ব্যবহার করে একটি অ্যানিমেশন বন্ধ করতে পারেন। cancel() মেথডটি শুধুমাত্র মেইন থ্রেডেই কল করতে হবে

দ্রষ্টব্য: সাধারণত, skipToEnd() মেথডটি একটি ভিজ্যুয়াল জাম্প ঘটায়।