نقل طرق العرض باستخدام صورة متحركة سريعة

تجربة طريقة Compose
‫Jetpack Compose هي مجموعة أدوات واجهة المستخدم المقترَحة لنظام التشغيل Android. تعرَّف على كيفية استخدام الصور المتحركة في Compose.

تستخدم الصور المتحركة المستندة إلى القذف قوة احتكاك تتناسب مع سرعة الجسم. يمكنك استخدامها لتحريك سمة عنصر وإنهاء الحركة تدريجيًا. وتكون لها قوة دفع أولية، يتم تلقّيها في الغالب من سرعة الإيماءة، ثم تتباطأ تدريجيًا. تنتهي الحركة عندما تكون سرعتها منخفضة بما يكفي لعدم إحداث أي تغيير مرئي على شاشة الجهاز.

الشكل 1: صورة متحركة سريعة

للاطّلاع على مواضيع ذات صلة، يُرجى قراءة الأدلة التالية:

إضافة مكتبة AndroidX

لاستخدام الصور المتحركة المستندة إلى الفيزياء، يجب إضافة مكتبة AndroidX إلى مشروعك على النحو التالي:

  1. افتح ملف build.gradle الخاص بوحدة تطبيقك.
  2. أضِف مكتبة 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 بكسل.