في كثير من الأحيان، يجب إعادة ضبط موضع العناصر على الشاشة بسبب تفاعل المستخدم أو المعالجة في الخلفية. بدلاً من تعديل موضع العنصر على الفور، ما يؤدي إلى وميضه من منطقة إلى أخرى، استخدِم صورة متحركة لنقله من موضع البداية إلى موضع النهاية.
إحدى الطرق التي يتيح لك 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، راجِع إضافة حركة باستخدام 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 للرسومات البيانية الأساسية الثلاثة في مواصفات التصميم المتعدد الأبعاد:
@interpolator/fast_out_linear_in.xml@interpolator/fast_out_slow_in.xml@interpolator/linear_out_slow_in.xml
استخدام PathInterpolator
فئة
PathInterpolator
هي أداة ربط تم تقديمها في Android 5.0 (المستوى 21 من واجهة برمجة التطبيقات). ويستند إلى
منحنى بيزير أو
كائن Path. تستخدم أمثلة Android في مستندات التصميم المتعدد الأبعاد الخاصة بتغيير السرعة PathInterpolator.
يحتوي PathInterpolator على دوال إنشاء تستند إلى أنواع مختلفة من منحنيات بيزير.
تحتوي جميع منحنيات بيزير على نقطتَي بداية ونهاية ثابتتَين عند (0,0) و(1,1) على التوالي. تعتمد وسيطات الدالة الإنشائية الأخرى على نوع منحنى بيزير الذي يتم إنشاؤه.
على سبيل المثال، لا يلزم سوى إحداثيات 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(); }
ينتج عن ذلك منحنى تغيير السرعة يبدأ بسرعة ويتباطأ كلما اقترب من النهاية.
يحتوي منشئ منحنى بيزير التكعيبي أيضًا على نقاط بداية ونهاية ثابتة، ولكنّه يتطلّب نقطتَي تحكّم:
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(); }
يؤدي ذلك إلى إنشاء منحنى تغيير السرعة نفسه كما في مثال 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 أداة الاستيفاء لتحديد التوقيت أو منحنى المسار عند بدء التشغيل.
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();