تستخدم الصور المتحركة المستندة إلى القذف قوة احتكاك تتناسب مع سرعة الجسم. يمكنك استخدامها لتحريك سمة عنصر وإنهاء الحركة تدريجيًا. وتكون لها قوة دفع أولية، يتم تلقّيها في الغالب من سرعة الإيماءة، ثم تتباطأ تدريجيًا. تنتهي الحركة عندما تكون سرعتها منخفضة بما يكفي لعدم إحداث أي تغيير مرئي على شاشة الجهاز.
للاطّلاع على مواضيع ذات صلة، يُرجى قراءة الأدلة التالية:
إضافة مكتبة AndroidX
لاستخدام الصور المتحركة المستندة إلى الفيزياء، يجب إضافة مكتبة AndroidX إلى مشروعك على النحو التالي:
- افتح ملف
build.gradleالخاص بوحدة تطبيقك. - أضِف مكتبة AndroidX إلى قسم
dependencies.أنيق
dependencies { implementation 'androidx.dynamicanimation:dynamicanimation:1.0.0' }
Kotlin
dependencies { implementation("androidx.dynamicanimation:dynamicanimation:1.0.0") }
إنشاء حركة سريعة
تتيح لك الفئة FlingAnimation إنشاء
صورة متحركة سريعة لعنصر معيّن. لإنشاء حركة قذف، أنشئ مثيلاً لفئة FlingAnimation وقدِّم عنصرًا وسمة العنصر التي تريد تحريكها.
Kotlin
val fling = FlingAnimation(view, DynamicAnimation.SCROLL_X)
Java
FlingAnimation fling = new FlingAnimation(view, DynamicAnimation.SCROLL_X);
ضبط السرعة
تحدّد السرعة الأولية سرعة تغيُّر سمة الحركة في بداية الحركة. يتم ضبط السرعة الأولية التلقائية على صفر بكسل في الثانية. لذلك، يجب تحديد سرعة بدء لضمان عدم انتهاء الحركة على الفور.
يمكنك استخدام قيمة ثابتة كسرعة بدء، أو يمكنك تحديدها استنادًا إلى سرعة إيماءة اللمس. إذا اخترت تقديم قيمة ثابتة، يجب تحديد القيمة بوحدة بكسل مستقل الكثافة في الثانية، ثم تحويلها إلى بكسل في الثانية. يتيح تحديد القيمة بوحدة dp في الثانية أن تكون السرعة مستقلة عن كثافة الجهاز وأشكاله. لمزيد من المعلومات حول تحويل السرعة الأولية إلى وحدات بكسل في الثانية، يُرجى الرجوع إلى قسم تحويل وحدات بكسل مستقلة الكثافة في الثانية إلى وحدات بكسل في الثانية في التحريك الارتدادي.
لضبط السرعة، يمكنك استدعاء طريقة setStartVelocity() وتمرير السرعة بالبكسل في الثانية. تعرض الطريقة عنصر التمرير السريع الذي تم ضبط السرعة عليه.
ملاحظة: استخدِم الفئتَين
GestureDetector.OnGestureListener و
VelocityTracker لاسترداد واحتساب
سرعة إيماءات اللمس على التوالي.
ضبط نطاق قيمة الرسوم المتحركة
يمكنك ضبط الحدّ الأدنى والحدّ الأقصى لقيم الحركة عندما تريد تقييد قيمة السمة على نطاق معيّن. يكون عنصر التحكّم في النطاق هذا مفيدًا بشكل خاص عند إضافة تأثيرات متحركة إلى السمات التي لها نطاق جوهري، مثل ألفا (من 0 إلى 1).
ملاحظة: عندما تصل قيمة حركة الرمي إلى الحد الأدنى أو الأقصى، تنتهي الحركة.
لضبط القيمتَين الدنيا والقصوى، يمكنك استدعاء الطريقتَين setMinValue() وsetMaxValue() على التوالي.
تعرض كلتا الطريقتَين عنصر الصورة المتحركة الذي ضبطت قيمته.
ضبط الاحتكاك
تتيح لك طريقة setFriction() تغيير احتكاك الحركة. ويحدّد مدى سرعة انخفاض السرعة في الحركة.
ملاحظة: إذا لم يتم ضبط الاحتكاك في بداية الحركة، تستخدم الحركة قيمة احتكاك تلقائية تبلغ 1.
تعرض الطريقة العنصر الذي تستخدم حركته قيمة الاحتكاك التي تقدّمها.
نموذج التعليمات البرمجية
يوضّح المثال أدناه حركة سريعة أفقية. السرعة التي تم تسجيلها من
أداة تتبُّع السرعة هي velocityX، ويتم ضبط حدود الانتقال للأعلى أو للأسفل
على 0 و
maxScroll. تم ضبط الاحتكاك على 1.1.
Kotlin
FlingAnimation(view, DynamicAnimation.SCROLL_X).apply { setStartVelocity(-velocityX) setMinValue(0f) setMaxValue(maxScroll) friction = 1.1f start() }
Java
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أو 1/10 بكسل. - بالنسبة إلى الصور المتحركة التي تستخدم التعتيم، يكون الحد الأدنى للتغيير المرئي هو
MIN_VISIBLE_CHANGE_ALPHAأو 1/256.
لضبط الحد الأدنى للتغيير المرئي في حركة، يمكنك استدعاء الطريقة
setMinimumVisibleChange() وتمرير
إما أحد الثوابت المرئية الدنيا أو قيمة تحتاج إلى حسابها
لخاصية مخصصة. لمزيد من المعلومات حول احتساب هذه القيمة، يُرجى الرجوع إلى قسم احتساب الحد الأدنى لقيمة التغيير المرئي.
Kotlin
anim.minimumVisibleChange = DynamicAnimation.MIN_VISIBLE_CHANGE_SCALE
Java
anim.setMinimumVisibleChange(DynamicAnimation.MIN_VISIBLE_CHANGE_SCALE);
ملاحظة: يجب تمرير قيمة فقط عند تحريك خاصية مخصّصة غير محدّدة بالبكسل.
احتساب الحد الأدنى لقيمة التغيير المرئي
لحساب الحد الأدنى لقيمة التغيير المرئي لخاصية مخصصة، استخدِم المعادلة التالية:
الحد الأدنى للتغيير المرئي = نطاق قيمة الخاصية المخصّصة / نطاق الحركة بالبكسل
على سبيل المثال، تتقدّم السمة التي تريد تحريكها من 0 إلى 100. يتوافق هذا مع تغيير بمقدار 200 بكسل. وفقًا للمعادلة، فإنّ الحد الأدنى لقيمة التغيير المرئي هو 100 / 200 يساوي 0.5 بكسل.