يتيح لك النقل المخصص إنشاء رسم متحرك لا يتوفر من أي من الفئات الانتقالية المضمنة. على سبيل المثال، يمكنك تحديد انتقال مخصص يحول تحويل لون المقدّمة الخاصة بحقول النصوص والإدخال إلى اللون الرمادي للإشارة إلى أنّ الحقول غير مفعّلة في الشاشة الجديدة. يساعد هذا النوع من التغيير المستخدمين في الاطّلاع على الحقول التي أوقفتها.
يعمل الانتقال المخصص، مثل أحد أنواع الانتقالات المضمنة، على تطبيق الرسوم المتحركة على مشاهد ثانوية لكل من مشهد البداية والنهاية. ومع ذلك، على عكس أنواع الانتقالات المضمنة، عليك توفير التعليمة البرمجية التي تلتقط قيم الخصائص وتنشئ رسومًا متحركة. قد تحتاج أيضًا إلى تحديد مجموعة فرعية من طرق العرض المستهدفة للرسم المتحرك.
تُعلّمك هذه الصفحة كيفية الحصول على قيم الخصائص وإنشاء رسوم متحركة لإنشاء الانتقالات المخصصة.
تمديد الفئة الانتقالية
لإنشاء انتقال مخصص، يمكنك إضافة فئة إلى مشروعك تعمل على توسيع فئة Transition
وإلغاء الدوال المعروضة في المقتطف التالي:
Kotlin
class CustomTransition : Transition() { override fun captureStartValues(transitionValues: TransitionValues) {} override fun captureEndValues(transitionValues: TransitionValues) {} override fun createAnimator( sceneRoot: ViewGroup, startValues: TransitionValues?, endValues: TransitionValues? ): Animator? {} }
Java
public class CustomTransition extends Transition { @Override public void captureStartValues(TransitionValues values) {} @Override public void captureEndValues(TransitionValues values) {} @Override public Animator createAnimator(ViewGroup sceneRoot, TransitionValues startValues, TransitionValues endValues) {} }
توضّح الأقسام التالية كيفية إلغاء هذه الدوال.
التقاط قيم خصائص الملف الشخصي
تستخدم الرسوم المتحركة الانتقالية نظام الرسوم المتحركة للخصائص الموضح في نظرة عامة على صور الموقع المتحركة: الموقع تعمل الرسوم المتحركة على تغيير خاصية عرض من قيمة بداية إلى قيمة نهاية على قيمة محددة فترة زمنية، لذلك يجب أن يحتوي إطار العمل على قيم البداية والنهاية الخاصية لإنشاء الرسوم المتحركة.
مع ذلك، تحتاج الصورة المتحركة للخاصية عادةً إلى مجموعة فرعية صغيرة فقط من خصائص الملف الشخصي. القيم. على سبيل المثال، تحتاج الحركة اللونية إلى قيم خاصية اللون، بينما تحتاج الحركة تحتاج الحركة إلى قيم خاصية الموضع. نظرًا لأن قيم الخصائص مطلوبة للرسوم المتحركة ترتبط بعملية انتقال، فإن إطار عمل الانتقالات لا يوفر جميع قيم الخصائص إلى مرحلة انتقالية. بدلاً من ذلك، يستدعي إطار العمل دوال معاودة الاتصال التي تسمح بالانتقال إلى والحصول فقط على قيم الخصائص التي يحتاجها وتخزينها في إطار العمل.
تسجيل القيم الأولية
لتمرير قيم طريقة عرض البداية إلى إطار العمل، نفِّذ
captureStartValues(transitionValues)
الأخرى. يستدعي إطار العمل هذه الوظيفة لكل عرض في المشهد البداية. الدالة
الوسيطة هي كائن TransitionValues
يحتوي على مرجع
إلى طريقة العرض ومثيل Map
حيث يمكنك تخزين قيم العرض التي
نريدها. أثناء التنفيذ، استرجع قيم الخصائص هذه ومررها مرة أخرى إلى
إطار العمل من خلال تخزينها في الخريطة.
للتأكد من أن مفتاح قيمة الخاصية لا يتعارض مع مفتاح
TransitionValues
، استخدِم نظام التسمية التالي:
package_name:transition_name:property_name
يوضّح المقتطف التالي طريقة تنفيذ دالة captureStartValues()
:
Kotlin
class CustomTransition : Transition() { // Define a key for storing a property value in // TransitionValues.values with the syntax // package_name:transition_class:property_name to avoid collisions private val PROPNAME_BACKGROUND = "com.example.android.customtransition:CustomTransition:background" override fun captureStartValues(transitionValues: TransitionValues) { // Call the convenience method captureValues captureValues(transitionValues) } // For the view in transitionValues.view, get the values you // want and put them in transitionValues.values private fun captureValues(transitionValues: TransitionValues) { // Get a reference to the view val view = transitionValues.view // Store its background property in the values map transitionValues.values[PROPNAME_BACKGROUND] = view.background } ... }
Java
public class CustomTransition extends Transition { // Define a key for storing a property value in // TransitionValues.values with the syntax // package_name:transition_class:property_name to avoid collisions private static final String PROPNAME_BACKGROUND = "com.example.android.customtransition:CustomTransition:background"; @Override public void captureStartValues(TransitionValues transitionValues) { // Call the convenience method captureValues captureValues(transitionValues); } // For the view in transitionValues.view, get the values you // want and put them in transitionValues.values private void captureValues(TransitionValues transitionValues) { // Get a reference to the view View view = transitionValues.view; // Store its background property in the values map transitionValues.values.put(PROPNAME_BACKGROUND, view.getBackground()); } ... }
تسجيل قيم النهاية
يستدعي إطار العمل الدالة captureEndValues(TransitionValues)
مرة واحدة لكل مشاهدة مستهدفة في مشهد النهاية. وفي جميع الجوانب الأخرى، تعمل captureEndValues()
بالطريقة نفسها التي يعمل بها captureStartValues()
.
يعرض مقتطف الرمز التالي طريقة تنفيذ دالة captureEndValues()
:
Kotlin
override fun captureEndValues(transitionValues: TransitionValues) { captureValues(transitionValues) }
Java
@Override public void captureEndValues(TransitionValues transitionValues) { captureValues(transitionValues); }
في هذا المثال، يظهر كل من captureStartValues()
وcaptureEndValues()
تستدعي الدوال captureValues()
لاسترداد القيم وتخزينها. موقع العرض
التي تستردها الدالة captureValues()
هي نفسها، ولكن لها قيم مختلفة في
مشهد البداية والنهاية. يحتفظ الإطار بخرائط منفصلة لكلٍّ من البداية والنهاية
حالات العرض.
إنشاء أداة إنشاء صور متحركة مخصّصة
لتحريك التغييرات إلى عرض بين حالته في المشهد الأول وحالته في
مشهد النهاية، قم بتوفير رسم متحرك من خلال تجاوز
createAnimator()
الأخرى. عندما يستدعي إطار العمل هذه الدالة، فإنها تمر في عرض الجذر للمشهد
TransitionValues
عناصر تحتوي على قيم البداية والنهاية
التقطتها.
يعتمد عدد مرات استدعاء إطار العمل للدالة createAnimator()
على
التغييرات التي تحدث بين مشهد البداية والنهاية.
على سبيل المثال، ضع في الاعتبار التلاشي أو
رسم متحرك يتلاشى يتم تنفيذه كانتقال مخصص. إذا كان المشهد الرئيسي خمسة أهداف،
الاثنان تمت إزالتهما من مشهد النهاية، والمشهد النهائي يضم الأهداف الثلاثة من
بدءًا من المشهد بالإضافة إلى هدف جديد، سيستدعي إطار العمل createAnimator()
ست مرات.
تُحرّك ثلاثة من المكالمات المتحركة العناصر التي تتلاشى تدريجيًا وتتلاشى للأهداف التي تبقى في كلا المشهدَين.
الأخرى. مكالمتان أخريان تحرّكان تلاشي الأهداف التي تمت إزالتها من مشهد النهاية. وَاحِدْ
لتحفيز تلاشي الهدف الجديد في مشهد النهاية.
بالنسبة إلى عدد المشاهدات المستهدَفة المعروضة في مشهدَي البداية والنهاية، يوفّر إطار العمل
كائن TransitionValues
لكل من startValues
endValues
وسيطة. بالنسبة إلى المشاهدات المستهدَفة التي تتوفّر فقط في بداية أو
مشهد النهاية، يوفر إطار العمل كائن TransitionValues
للوسيطة المقابلة وnull
للوسيطة الأخرى.
لتنفيذ الدالة createAnimator(ViewGroup, TransitionValues, TransitionValues)
عند إنشاء
انتقال مخصص، استخدم قيم خصائص العرض التي التقطتها لإنشاء عنصر Animator
وإعادته إلى إطار العمل. كمثال على التنفيذ،
عرض الفئة ChangeColor
في
نموذج CustomTransit. لمزيد من المعلومات عن مصممي العقارات، راجع
حركة الموقع:
تطبيق انتقال مخصص
تعمل عمليات الانتقال المخصصة بالطريقة نفسها التي تعمل بها الانتقالات المضمنة. يمكنك تطبيق تأثير انتقال مخصص باستخدام مدير انتقالي، كما هو موضح في تطبيق عملية نقل.