اشیاء روی صفحه اغلب به دلیل تعامل کاربر یا پردازش در پشت صحنه نیاز به تغییر موقعیت دارند. بهجای بهروزرسانی فوری موقعیت جسم، که باعث میشود از یک ناحیه به ناحیه دیگر چشمک بزند، از یک انیمیشن برای انتقال آن از موقعیت شروع به نقطه پایان استفاده کنید.
یکی از راههایی که اندروید به شما امکان میدهد اشیاء مشاهده خود را روی صفحه تغییر مکان دهید، استفاده از ObjectAnimator
است. شما موقعیت پایانی را که می خواهید شی در آن قرار گیرد و همچنین مدت زمان انیمیشن را ارائه می دهید. همچنین می توانید از درون یابی زمان برای کنترل شتاب یا کاهش سرعت انیمیشن استفاده کنید.
موقعیت نمایش را با ObjectAnimator تغییر دهید
ObjectAnimator
API راهی برای تغییر خصوصیات یک نما با مدت زمان مشخص ارائه می دهد. این شامل متدهای ثابت برای ایجاد نمونه هایی از ObjectAnimator
بسته به نوع مشخصه ای است که متحرک می کنید. هنگام تغییر موقعیت نماهای خود روی صفحه، از ویژگی translationX
و translationY
استفاده کنید.
در اینجا نمونه ای از ObjectAnimator
است که نمای را در عرض 2 ثانیه به موقعیتی 100 پیکسلی از سمت چپ صفحه منتقل می کند:
کاتلین
ObjectAnimator.ofFloat(view, "translationX", 100f).apply { duration = 2000 start() }
جاوا
ObjectAnimator animation = ObjectAnimator.ofFloat(view, "translationX", 100f); animation.setDuration(2000); animation.start();
این مثال از متد ObjectAnimator.ofFloat()
استفاده می کند، زیرا مقادیر ترجمه باید float باشند. اولین پارامتر نمایی است که می خواهید متحرک کنید. پارامتر دوم خاصیتی است که در حال متحرک سازی هستید. از آنجایی که view باید به صورت افقی حرکت کند، از ویژگی translationX
استفاده می شود. آخرین پارامتر مقدار پایانی انیمیشن است. در این مثال، مقدار 100 موقعیتی را نشان می دهد که تعداد پیکسل های زیادی از سمت چپ صفحه نمایش وجود دارد.
روش بعدی مشخص می کند که انیمیشن چقدر طول می کشد، در میلی ثانیه. در این مثال، انیمیشن به مدت 2 ثانیه (2000 میلی ثانیه) اجرا می شود.
آخرین روش باعث می شود انیمیشن اجرا شود که موقعیت نما روی صفحه را به روز می کند.
برای اطلاعات بیشتر در مورد استفاده از ObjectAnimator
، به انیمیشن با استفاده از ObjectAnimator مراجعه کنید.
حرکت منحنی را اضافه کنید
در حالی که استفاده از ObjectAnimator
راحت است، به طور پیشفرض نما را در امتداد یک خط مستقیم بین نقطه شروع و پایان تغییر مکان میدهد. طراحی متریال برای حرکت فضایی اشیاء روی صفحه و زمان بندی یک انیمیشن بر منحنی ها تکیه دارد. استفاده از حرکت منحنی به برنامه شما حس مادی بیشتری می دهد و در عین حال انیمیشن های شما را جذاب تر می کند.
مسیر خود را مشخص کنید
کلاس ObjectAnimator
سازنده هایی دارد که به شما امکان می دهد مختصات را با استفاده از دو یا چند ویژگی به طور همزمان همراه با یک مسیر متحرک کنید. به عنوان مثال، انیماتور زیر از یک شی Path
برای متحرک سازی ویژگی های X و Y یک view استفاده می کند:
کاتلین
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { val path = Path().apply { arcTo(0f, 0f, 1000f, 1000f, 270f, -180f, true) } val animator = ObjectAnimator.ofFloat(view, View.X, View.Y, path).apply { duration = 2000 start() } } else { // Create animator without using curved path }
جاوا
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { Path path = new Path(); path.arcTo(0f, 0f, 1000f, 1000f, 270f, -180f, true); ObjectAnimator animator = ObjectAnimator.ofFloat(view, View.X, View.Y, path); animator.setDuration(2000); animator.start(); } else { // Create animator without using curved path }
در اینجا انیمیشن قوس به نظر می رسد:
شکل 1. انیمیشن مسیر منحنی.
Interpolator
اجرای یک منحنی کاهش است. برای اطلاعات بیشتر در مورد مفهوم کاهش منحنی ها به مستندات طراحی مواد مراجعه کنید. Interpolator
نحوه محاسبه مقادیر خاص در یک انیمیشن را به عنوان تابعی از زمان تعریف می کند. این سیستم منابع XML را برای سه منحنی اصلی در مشخصات طراحی مواد فراهم می کند:
-
@interpolator/fast_out_linear_in.xml
-
@interpolator/fast_out_slow_in.xml
-
@interpolator/linear_out_slow_in.xml
از PathInterpolator استفاده کنید
کلاس PathInterpolator
یک درون یابی است که در اندروید 5.0 (API 21) معرفی شده است. این بر اساس یک منحنی بزیه یا یک شی Path
است. مثالهای اندروید در مستندات طراحی مواد برای سهولت از PathInterpolator
استفاده میکنند.
PathInterpolator
سازنده هایی بر اساس انواع مختلف منحنی های Bézier دارد. تمام منحنی های Bézier دارای نقاط شروع و پایان هستند که به ترتیب در (0,0)
و (1,1)
ثابت هستند. آرگومان های سازنده دیگر به نوع منحنی بزیه که ایجاد می شود بستگی دارد.
برای مثال، برای منحنی بزیه درجه دوم، فقط مختصات X و Y یک نقطه کنترل مورد نیاز است:
کاتلین
val myInterpolator = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { PathInterpolator(0.67f, 0.33f) } else { LinearInterpolator() }
جاوا
Interpolator myInterpolator = null; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { myInterpolator = new PathInterpolator(0.67f, 0.33f); } else { myInterpolator = new LinearInterpolator(); }
این یک منحنی کاهشی ایجاد می کند که به سرعت شروع می شود و با نزدیک شدن به انتها سرعت آن کاهش می یابد.
سازنده Bézier مکعبی به طور مشابه دارای نقاط شروع و پایان ثابت است، اما به دو نقطه کنترل نیاز دارد:
کاتلین
val myInterpolator = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { PathInterpolator(0.5f, 0.7f, 0.1f, 1.0f) } else { LinearInterpolator() }
جاوا
Interpolator myInterpolator = null; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { myInterpolator = new PathInterpolator(0.5f, 0.7f, 0.1f, 1.0f); } else { myInterpolator = new LinearInterpolator(); }
این یک اجرای منحنی کاهش سرعت تاکید شده طراحی مواد است.
برای کنترل بیشتر می توان از یک Path
دلخواه برای تعریف منحنی استفاده کرد:
کاتلین
val myInterpolator = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { val path = Path().apply { moveTo(0.0f, 0.0f) cubicTo(0.5f, 0.7f, 0.1f, 1.0f, 1.0f, 1.0f) } PathInterpolator(path) } else { LinearInterpolator() }
جاوا
Interpolator myInterpolator = null; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { Path path = new Path(); path.moveTo(0.0f, 0.0f); path.cubicTo(0.5f, 0.7f, 0.1f, 1.0f, 1.0f, 1.0f); myInterpolator = new PathInterpolator(path); } else { myInterpolator = new LinearInterpolator(); }
این منحنی آسانسازی مشابه نمونه مکعبی Bézier را ایجاد میکند، اما در عوض از یک Path
استفاده میکند.
همچنین میتوانید درونیابی مسیر را به عنوان یک منبع XML تعریف کنید:
<pathInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
android:controlX1="0.5"
android:controlY1="0.7"
android:controlX2="0.1f"
android:controlY2="1.0f"/>
هنگامی که یک شی PathInterpolator
ایجاد کردید، می توانید آن را به متد Animator.setInterpolator()
ارسال کنید. Animator
از درون یابی برای تعیین زمان یا منحنی مسیر هنگام شروع استفاده می کند.
کاتلین
val animation = ObjectAnimator.ofFloat(view, "translationX", 100f).apply { interpolator = myInterpolator start() }
جاوا
ObjectAnimator animation = ObjectAnimator.ofFloat(view, "translationX", 100f); animation.setInterpolator(myInterpolator); animation.start();