با استفاده از فیزیک بهار حرکت را متحرک کنید

روش نوشتن را امتحان کنید
Jetpack Compose ابزار رابط کاربری پیشنهادی برای اندروید است. یاد بگیرید که چگونه از انیمیشن‌ها در Compose استفاده کنید.

حرکت مبتنی بر فیزیک توسط نیرو هدایت می‌شود. نیروی فنر یکی از این نیروهاست که تعامل و حرکت را هدایت می‌کند. نیروی فنر دارای خواص زیر است: میرایی و سختی. در یک انیمیشن مبتنی بر فنر، مقدار و سرعت بر اساس نیروی فنری که بر هر فریم اعمال می‌شود، محاسبه می‌شوند.

اگر می‌خواهید انیمیشن‌های برنامه‌تان فقط در یک جهت کند شوند، به جای آن از انیمیشن fling مبتنی بر اصطکاک استفاده کنید.

چرخه حیات یک انیمیشن بهاری

در یک انیمیشن مبتنی بر فنر، کلاس SpringForce به شما امکان می‌دهد سختی فنر، نسبت میرایی آن و موقعیت نهایی آن را سفارشی کنید. به محض شروع انیمیشن، نیروی فنر مقدار انیمیشن و سرعت را در هر فریم به‌روزرسانی می‌کند. انیمیشن تا زمانی که نیروی فنر به تعادل برسد، ادامه می‌یابد.

برای مثال، اگر آیکون یک برنامه را روی صفحه نمایش بکشید و بعداً با برداشتن انگشت خود از روی آیکون، آن را رها کنید، آیکون توسط نیرویی نامرئی اما آشنا به جای اصلی خود برمی‌گردد.

شکل ۱ اثر فنری مشابهی را نشان می‌دهد. علامت جمع (+) در وسط دایره، نیروی اعمال شده از طریق یک حرکت لمسی را نشان می‌دهد.

انتشار بهاری
شکل ۱. اثر رهاسازی فنر

ساخت انیمیشن بهاری

مراحل کلی ساخت انیمیشن فنری برای برنامه شما به شرح زیر است:

بخش‌های بعدی مراحل کلی ساخت انیمیشن فنری را با جزئیات مورد بحث قرار می‌دهند.

کتابخانه پشتیبانی را اضافه کنید

برای استفاده از کتابخانه پشتیبانی مبتنی بر فیزیک، باید کتابخانه پشتیبانی را به صورت زیر به پروژه خود اضافه کنید:

  1. فایل build.gradle مربوط به ماژول app خود را باز کنید.
  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 : این ویژگی‌ها چرخش در فضای دوبعدی (ویژگی rotation ) و سه‌بعدی را حول نقطه محوری کنترل می‌کنند.
  • SCROLL_X و SCROLL_Y : این ویژگی‌ها میزان جابجایی اسکرول از سمت چپ منبع و لبه بالایی را بر حسب پیکسل نشان می‌دهند. همچنین موقعیت را بر حسب میزان اسکرول شدن صفحه نشان می‌دهند.
  • SCALE_X و SCALE_Y : این ویژگی‌ها مقیاس‌بندی دوبعدی یک نما را حول نقطه محوری آن کنترل می‌کنند.
  • X ، Y و Z : اینها ویژگی‌های کاربردی پایه‌ای برای توصیف موقعیت نهایی نما در کانتینر آن هستند.

ثبت نام شنوندگان

کلاس DynamicAnimation دو شنونده (listener) ارائه می‌دهد: 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() را فراخوانی کرده و مقدار شروع انیمیشن را به آن ارسال کنید. اگر مقدار شروع را تنظیم نکنید، انیمیشن از مقدار فعلی ویژگی شیء به عنوان مقدار شروع استفاده می‌کند.

تنظیم محدوده مقادیر انیمیشن

وقتی می‌خواهید مقدار ویژگی را در یک محدوده خاص محدود کنید، می‌توانید حداقل و حداکثر مقادیر انیمیشن را تنظیم کنید. همچنین در صورتی که ویژگی‌هایی را که دارای محدوده ذاتی هستند، مانند آلفا (از 0 تا 1)، متحرک می‌کنید، این به کنترل محدوده کمک می‌کند.

  • برای تنظیم حداقل مقدار، متد 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 بر ثانیه به پیکسل بر ثانیه

سرعت فنر باید بر حسب پیکسل بر ثانیه باشد. اگر می‌خواهید مقدار ثابتی را به عنوان شروع سرعت ارائه دهید، مقدار را بر حسب dp بر ثانیه ارائه دهید و سپس آن را به پیکسل بر ثانیه تبدیل کنید. برای تبدیل، از متد applyDimension() از کلاس TypedValue استفاده کنید. به نمونه کد زیر مراجعه کنید:

کاتلین

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

جاوا

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

تنظیم ویژگی‌های اسپرینگ

کلاس SpringForce متدهای getter و setter را برای هر یک از ویژگی‌های فنر، مانند نسبت میرایی و سختی، تعریف می‌کند. برای تنظیم ویژگی‌های فنر، مهم است که یا شیء نیروی فنر را بازیابی کنید یا یک نیروی فنر سفارشی ایجاد کنید که بتوانید ویژگی‌ها را روی آن تنظیم کنید. برای اطلاعات بیشتر در مورد ایجاد یک نیروی فنر سفارشی، به بخش ایجاد یک نیروی فنر سفارشی مراجعه کنید.

نکته: هنگام استفاده از متدهای setter، می‌توانید یک زنجیره متد ایجاد کنید زیرا همه متدهای setter شیء نیروی فنر را برمی‌گردانند.

نسبت میرایی

نسبت میرایی، کاهش تدریجی نوسان فنر را توصیف می‌کند. با استفاده از نسبت میرایی، می‌توانید سرعت کاهش نوسانات از یک جهش به جهش بعدی را تعریف کنید. چهار روش مختلف برای میرایی یک فنر وجود دارد:

  • میرایی بیش از حد زمانی رخ می‌دهد که نسبت میرایی بزرگتر از یک باشد. این امر به جسم اجازه می‌دهد تا به آرامی به حالت سکون بازگردد.
  • میرایی بحرانی زمانی اتفاق می‌افتد که نسبت میرایی برابر با یک باشد. این حالت به جسم اجازه می‌دهد تا در کمترین زمان به حالت سکون بازگردد.
  • میرایی کمتر از حد زمانی اتفاق می‌افتد که نسبت میرایی کمتر از یک باشد. این حالت به جسم اجازه می‌دهد تا با عبور از موقعیت سکون، چندین بار از حد خود فراتر رود و سپس به تدریج به موقعیت سکون برسد.
  • میرایی نامیرا زمانی رخ می‌دهد که نسبت میرایی برابر با صفر باشد. این حالت به جسم اجازه می‌دهد تا ابد نوسان کند.

برای اضافه کردن نسبت میرایی به فنر، مراحل زیر را انجام دهید:

  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) روی 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() . هر دو متد باید در thread اصلی فراخوانی شوند.

متد 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() انیمیشن را تا آخرین مقدار رد می‌کند و سپس آن را خاتمه می‌دهد.

قبل از اینکه بتوانید انیمیشن را خاتمه دهید، مهم است که ابتدا وضعیت فنر را بررسی کنید. اگر وضعیت آن میرا نشده باشد، انیمیشن هرگز نمی‌تواند به حالت سکون برسد. برای بررسی وضعیت فنر، متد canSkipToEnd() را فراخوانی کنید. اگر فنر میرا شده باشد، متد true و در غیر این صورت false را برمی‌گرداند.

زمانی که از وضعیت فنر مطلع شدید، می‌توانید با استفاده از متد skipToEnd() یا متد cancel() یک انیمیشن را خاتمه دهید. متد cancel() فقط باید در نخ اصلی فراخوانی شود.

نکته: به طور کلی، متد skipToEnd() باعث پرش بصری می‌شود.