غالبًا ما تحتاج العناصر الموجودة على الشاشة إلى تغيير موضعها بسبب تفاعل المستخدم أو معالجتها وراء الكواليس. بدلاً من تعديل موضع الجسم على الفور، ما يؤدي إلى وميضه من منطقة إلى أخرى، استخدِم صورة متحركة لتحريكه من الموضع الأوّلي إلى الموضع النهائي.
من بين الطرق التي يتيح لك Android من خلالها تغيير موضع عناصر العرض على الشاشة
استخدام ObjectAnimator
. يمكنك تحديد موضع النهاية الذي تريد أن يستقر فيه الكائن، بالإضافة إلى مدة الحركة. يمكنك أيضًا استخدام أدوات فهم الوقت للتحكم في تسريع أو تباطؤ الرسوم المتحركة.
تغيير موضع العرض باستخدام ObjectAnimator
توفّر واجهة برمجة التطبيقات ObjectAnimator
طريقة لتغيير خصائص الملف الشخصي خلال مدة محدّدة.
يحتوي على طرق ثابتة لإنشاء نُسخ من ObjectAnimator
استنادًا إلى
نوع السمة التي تنشئ لها مؤثرًا متحركًا. عند إعادة وضع طرق العرض على
الشاشة، استخدِم السمتَين translationX
وtranslationY
.
إليك مثال على ObjectAnimator
الذي ينقل العرض إلى موضع 100
بكسل من يسار الشاشة خلال ثانيتين:
Kotlin
ObjectAnimator.ofFloat(view, "translationX", 100f).apply { duration = 2000 start() }
Java
ObjectAnimator animation = ObjectAnimator.ofFloat(view, "translationX", 100f); animation.setDuration(2000); animation.start();
يستخدم هذا المثال الطريقة
ObjectAnimator.ofFloat()
،
لأنّ قيم الترجمة يجب أن تكون أعدادًا عشرية. المعلمة الأولى هي
العرض الذي تريد تحريكه. المعلمة الثانية هي السمة التي تريد
تحريكها. بما أنّ طريقة العرض تحتاج إلى التحرك أفقيًا، يتم استخدام السمة translationX
. المَعلمة الأخيرة هي قيمة نهاية الصورة المتحركة. في هذا
المثال، تشير القيمة 100 إلى موضع يبعد هذا العدد من البكسل عن يمين
الشاشة.
تحدد الطريقة التالية المدة التي تستغرقها الحركة بالمللي ثانية. في هذا المثال، يتم تشغيل الصورة المتحركة لمدة ثانيتَين (2000 ملي ثانية).
تؤدي الطريقة الأخيرة إلى تشغيل الرسم المتحرك، ما يؤدي إلى تعديل موضع العرض على الشاشة.
لمزيد من المعلومات حول استخدام ObjectAnimator
، يرجى الاطّلاع على Animate باستخدام
ObjectAnimator.
إضافة حركة منحنية
على الرغم من أنّ استخدام الرمز ObjectAnimator
ملائم، إلا أنّه يعيد تلقائيًا وضع
العرض على طول خط مستقيم بين نقطتَي البداية والنهاية. يعتمد أسلوب Material Design على الخطوط المنحنية للحركة المكانية للعناصر على الشاشة وتحديد توقيت الرسم المتحرك. يمنح استخدام الصور المتحركة المنحنية تطبيقك مظهرًا أكثر حداثة
ويجعل الصور المتحركة أكثر إثارة للاهتمام.
تحديد مسارك الخاص
تحتوي فئة ObjectAnimator
على وظائف تنشئ عناصر تتيح لك إضافة تأثيرات متحركة إلى التنسيقات باستخدام سمتَين أو أكثر في الوقت نفسه مع مسار. على سبيل المثال، تستخدم أداة إنشاء الصور المتحركة التالية كائن Path
لتحريك السمتَين X وY لملف شخصي:
Kotlin
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 }
Java
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 للمنحنيات الأساسية الثلاثة في
مواصفات Material Design:
@interpolator/fast_out_linear_in.xml
@interpolator/fast_out_slow_in.xml
@interpolator/linear_out_slow_in.xml
استخدام PathInterpolator
الفئة
PathInterpolator
هي أداة تعديل تم إطلاقها في الإصدار Android 5.0 (واجهة برمجة التطبيقات 21). يستند إلى
منحنى Bézier أو كائن
Path
. تستخدم أمثلة Android في مستندات Material Design المتعلّقة
بتأثيرات التلاشي
PathInterpolator
.
تحتوي PathInterpolator
على منشئين يستندان إلى أنواع مختلفة من منحنيات Bézier.
تتضمّن جميع منحنيات Bézier نقطتَي بداية ونهاية ثابتتَين عند (0,0)
و(1,1)
على التوالي. تعتمد مَعلمات المُنشئ الأخرى على نوع منحنى Bézier
الذي يتم إنشاؤه.
على سبيل المثال، بالنسبة لمنحنى بيزيه التربيعي، يلزم فقط الإحداثيتين X وY لنقطة تحكم واحدة:
Kotlin
val myInterpolator = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { PathInterpolator(0.67f, 0.33f) } else { LinearInterpolator() }
Java
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 الثلاثي على نقطتَي بداية ونهاية ثابتتَين، ولكنه يتطلّب نقطتَي تحكّم:
Kotlin
val myInterpolator = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { PathInterpolator(0.5f, 0.7f, 0.1f, 1.0f) } else { LinearInterpolator() }
Java
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
عشوائي لتحديد المنحنى:
Kotlin
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() }
Java
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(); }
وينتج عن ذلك منحنى الإرخاء نفسه مثل مثال بيزيه المكعّب، ولكنه يستخدم 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
أداة الاستيفاء لتحديد التوقيت أو منحنى المسار عند بدء تشغيله.
Kotlin
val animation = ObjectAnimator.ofFloat(view, "translationX", 100f).apply { interpolator = myInterpolator start() }
Java
ObjectAnimator animation = ObjectAnimator.ofFloat(view, "translationX", 100f); animation.setInterpolator(myInterpolator); animation.start();