جابه‌جا کردن نماها بااستفاده از پویانمایی پرتابی

امتحان کردن روش Compose
Jetpack Compose جعبه‌ابزار واسط کاربر توصیه‌شده برای Android است. با نحوه استفاده از «پویانمایی‌ها» در Compose آشنا شوید.

پویانمایی مبتنی بر پرتاب از نیروی اصطکاکی استفاده می‌کند که متناسب با سرعت جسم است. از آن برای پویانمایی کردن ویژگی یک شیء و پایان دادن تدریجی پویانمایی استفاده کنید. این حرکت دارای یک تکانه اولیه است که بیشتر از سرعت اشاره دریافت می‌شود و به‌تدریج کند می‌شود. وقتی سرعت پویانمایی به‌اندازه کافی کم باشد که تغییر قابل‌مشاهده‌ای در صفحه دستگاه ایجاد نکند، پویانمایی به پایان می‌رسد.

شکل ۱. پویانمایی پرتابی

برای آشنایی با موضوعات مرتبط، راهنماهای زیر را بخوانید:

افزودن کتابخانه AndroidX

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

  1. فایل build.gradle را برای واحد برنامه باز کنید.
  2. کتابخانه AndroidX را به بخش dependencies اضافه کنید.

    شیک

            dependencies {
                implementation 'androidx.dynamicanimation:dynamicanimation:1.0.0'
            }
            

    کاتلین

            dependencies {
                implementation("androidx.dynamicanimation:dynamicanimation:1.0.0")
            }
            

ایجاد پویانمایی پرتابی

کلاس FlingAnimation به شما امکان می‌دهد پویانمایی پرتابی برای شیء ایجاد کنید. برای ساختن پویانمایی پرتابی، نمونه‌ای از کلاس FlingAnimation ایجاد کنید و شیء و ویژگی شیء موردنظر برای پویانمایی را ارائه دهید.

کاتلین

val fling = FlingAnimation(view, DynamicAnimation.SCROLL_X)

جاوا

FlingAnimation fling = new FlingAnimation(view, DynamicAnimation.SCROLL_X);

تنظیم سرعت

سرعت شروع، سرعتی را که ویژگی پویانمایی در ابتدای پویانمایی تغییر می‌کند تعریف می‌کند. سرعت شروع پیش‌فرض روی صفر پیکسل در ثانیه تنظیم شده است. بنابراین، باید سرعت شروع را تعریف کنید تا مطمئن شوید پویانمایی بلافاصله به‌پایان نمی‌رسد.

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

برای تنظیم سرعت، روش setStartVelocity() را فراخوانی کنید و سرعت را برحسب پیکسل در ثانیه ارسال کنید. این روش شیء fling را که سرعت روی آن تنظیم شده است برمی‌گرداند.

توجه: از کلاس‌های GestureDetector.OnGestureListener و VelocityTracker برای بازیابی و محاسبه سرعت اشاره‌های لمسی استفاده کنید.

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

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

توجه: وقتی مقدار پویانمایی پرتابی به حداقل یا حداکثر مقدار می‌رسد، پویانمایی پایان می‌یابد.

برای تنظیم مقادیر حداقل و حداکثر، به‌ترتیب روش‌های setMinValue() و setMaxValue() را فراخوانی کنید. هر دو روش شیء پویانمایی را که برای آن مقدار تنظیم کرده‌اید برمی‌گردانند.

تنظیم اصطکاک

روش setFriction() به شما امکان می‌دهد اصطکاک پویانمایی را تغییر دهید. این ویژگی تعیین می‌کند که سرعت در پویانمایی با چه سرعتی کاهش یابد.

توجه: اگر اصطکاک را در ابتدای پویانمایی تنظیم نکنید، پویانمایی از مقدار اصطکاک پیش‌فرض ۱ استفاده می‌کند.

این روش شیئی را برمی‌گرداند که پویانمایی آن از مقدار اصطکاکی که شما ارائه می‌دهید استفاده می‌کند.

کدگذاری نمونه

مثال زیر یک پرتاب افقی را نشان می‌دهد. سرعت ضبط‌شده از ردیاب سرعت velocityX است و حدود پیمایش روی ۰ و maxScroll تنظیم شده است. اصطکاک روی ۱٫۱ تنظیم شده است.

کاتلین

FlingAnimation(view, DynamicAnimation.SCROLL_X).apply {
    setStartVelocity(-velocityX)
    setMinValue(0f)
    setMaxValue(maxScroll)
    friction = 1.1f
    start()
}

جاوا

FlingAnimation fling = new FlingAnimation(view, DynamicAnimation.SCROLL_X);
fling.setStartVelocity(-velocityX)
        .setMinValue(0)
        .setMaxValue(maxScroll)
        .setFriction(1.1f)
        .start();

تنظیم حداقل تغییر قابل‌مشاهده

وقتی ویژگی سفارشی‌ای را که با پیکسل تعریف نشده است پویانمایی می‌کنید، باید حداقل تغییر مقدار پویانمایی را که برای کاربران قابل‌مشاهده است تنظیم کنید. این آستانه معقولی را برای پایان دادن به پویانمایی تعیین می‌کند.

هنگام پویانمایی DynamicAnimation.ViewProperty، نیازی به فراخوانی این روش نیست زیرا حداقل تغییر نمایان از ویژگی مشتق می‌شود. برای مثال:

  • مقدار پیش‌فرض حداقل تغییر قابل‌مشاهده برای ویژگی‌های نما، مثل TRANSLATION_X،‏ TRANSLATION_Y،‏ TRANSLATION_Z،‏ SCROLL_X، و SCROLL_Y، ۱ پیکسل است.
  • برای پویانمایی‌هایی که از چرخش استفاده می‌کنند، مثل ROTATION، ROTATION_X، و ROTATION_Y، حداقل تغییر نمایان MIN_VISIBLE_CHANGE_ROTATION_DEGREES، یا ۱/۱۰ پیکسل است.
  • برای پویانمایی‌هایی که از کدری استفاده می‌کنند، حداقل تغییر نمایان MIN_VISIBLE_CHANGE_ALPHA یا ۱/۲۵۶ است.

برای تنظیم حداقل تغییر قابل‌مشاهده برای پویانمایی، روش setMinimumVisibleChange() را فراخوانی کنید و یکی از ثابت‌های حداقل قابل‌مشاهده یا مقداری را که باید برای ویژگی سفارشی محاسبه کنید ارسال کنید. برای اطلاعات بیشتر درباره محاسبه این مقدار، به بخش محاسبه مقدار حداقل تغییر قابل‌مشاهده مراجعه کنید.

کاتلین

anim.minimumVisibleChange = DynamicAnimation.MIN_VISIBLE_CHANGE_SCALE

جاوا

anim.setMinimumVisibleChange(DynamicAnimation.MIN_VISIBLE_CHANGE_SCALE);

توجه: فقط زمانی باید مقدار را ارسال کنید که یک ویژگی سفارشی را که برحسب پیکسل تعریف نشده است پویانمایی کنید.

درحال محاسبه مقدار حداقل تغییر قابل‌مشاهده

برای محاسبه حداقل مقدار تغییر قابل‌مشاهده برای ویژگی سفارشی، از فرمول زیر استفاده کنید:

حداقل تغییر قابل‌مشاهده = محدوده مقدار ویژگی سفارشی / محدوده پویانمایی به پیکسل

برای مثال، ویژگی‌ای که می‌خواهید پویانمایی کنید از ۰ به ۱۰۰ پیشرفت می‌کند. این مقدار با تغییر ۲۰۰ پیکسلی مطابقت دارد. طبق فرمول، حداقل مقدار تغییر قابل‌مشاهده ۱۰۰ / ۲۰۰ برابر با ۰٫۵ پیکسل است.