تحريك تغييرات التنسيق باستخدام عملية نقل

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

يتيح لك إطار عمل النقل على Android إمكانية تحريك جميع أنواع الحركة في واجهة المستخدم من خلال توفير تنسيقَي البداية والنهاية. يمكنك تحديد نوع الرسوم المتحركة التي تريدها — مثل تلاشي طرق العرض بالداخل أو خارجه أو تغيير أحجام طرق العرض — ويحدد إطار عمل الانتقال كيفية الرسوم المتحركة من تخطيط البداية إلى تنسيق النهاية.

يتضمن إطار عمل عملية النقل الميزات التالية:

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

للحصول على نموذج للرمز الذي يتحرك بين تغييرات التنسيق، يُرجى الاطّلاع على BasicTransition.

وتكون العملية الأساسية للتحريك بين مخططين كما يلي:

  1. أنشئ كائن Scene لتنسيقات البداية والنهاية. ومع ذلك، غالبًا ما يتم تحديد مشهد تخطيط البداية تلقائيًا من التخطيط الحالي.
  2. أنشِئ كائن Transition لتحديد نوع الصورة المتحركة التي تريدها.
  3. استدعِ TransitionManager.go()، وسيشغِّل النظام الصورة المتحركة لتبديل التنسيقات.

يوضح الرسم التخطيطي في الشكل 1 العلاقة بين التخطيطات الخاصة بك، والمشاهد، والانتقال، والرسوم المتحركة النهائية.

الشكل 1. رسم توضيحي أساسي لكيفية إنشاء إطار الانتقال للرسوم المتحركة.

إنشاء مشهد

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

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

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

إنشاء مشهد من مورد تخطيط

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

لإنشاء مثيل Scene من ملف موارد تنسيق، استرجع جذر المشهد من التنسيق ViewGroup. بعد ذلك، يجب استدعاء الدالة Scene.getSceneForLayout() مع جذر المشهد ورقم تعريف المورد لملف التنسيق الذي يحتوي على التسلسل الهرمي لطريقة العرض.

تحديد تصميمات للمشهد

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

يتألف المثال من تعريفات التنسيق التالية:

  • التنسيق الرئيسي لنشاط مع تصنيف نصي وعنصر فرعي FrameLayout.
  • ConstraintLayout للمشهد الأول مع حقلين نصيين.
  • ConstraintLayout للمشهد الثاني به نفس الحقلين النصيين بترتيب مختلف.

تم تصميم المثال بحيث تحدث جميع الرسوم المتحركة داخل التخطيط الثانوي للتخطيط الرئيسي للنشاط. تظل التسمية النصية في التخطيط الرئيسي ثابتة.

يتم تعريف التخطيط الرئيسي للنشاط على النحو التالي:

res/layout/activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/master_layout">
    <TextView
        android:id="@+id/title"
        ...
        android:text="Title"/>
    <FrameLayout
        android:id="@+id/scene_root">
        <include layout="@layout/a_scene" />
    </FrameLayout>
</LinearLayout>

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

يتم تعريف تخطيط المشهد الأول على النحو التالي:

res/layout/a_scene.xml

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/scene_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    
    
</androidx.constraintlayout.widget.ConstraintLayout>

يحتوي تخطيط المشهد الثاني على نفس حقلي النص - بنفس المعرفات - بترتيب مختلف. ويتم تعريفه على النحو التالي:

res/layout/another_scene.xml

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/scene_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    
    
</androidx.constraintlayout.widget.ConstraintLayout>

إنشاء مشاهد من التنسيقات

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

يعرض مقتطف الرمز التالي كيفية الحصول على مرجع إلى جذر المشهد وإنشاء عنصرَي Scene من ملفات التنسيق:

Kotlin

val sceneRoot: ViewGroup = findViewById(R.id.scene_root)
val aScene: Scene = Scene.getSceneForLayout(sceneRoot, R.layout.a_scene, this)
val anotherScene: Scene = Scene.getSceneForLayout(sceneRoot, R.layout.another_scene, this)

Java

Scene aScene;
Scene anotherScene;

// Create the scene root for the scenes in this app.
sceneRoot = (ViewGroup) findViewById(R.id.scene_root);

// Create the scenes.
aScene = Scene.getSceneForLayout(sceneRoot, R.layout.a_scene, this);
anotherScene =
    Scene.getSceneForLayout(sceneRoot, R.layout.another_scene, this);

يتوفّر الآن في التطبيق كائنان Scene استنادًا إلى العروض الهرمية على طريقة العرض. يستخدم كلا المشهدَين جذر المشهد الذي حدّده العنصر FrameLayout في res/layout/activity_main.xml.

إنشاء مشهد في التعليمات البرمجية

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

لإنشاء مشهد من العرض الهرمي لطريقة العرض في الرمز، استخدِم الدالة الإنشائية Scene(sceneRoot, viewHierarchy). يعادل استدعاء هذه الدالة الإنشائية استدعاء الدالة Scene.getSceneForLayout() عندما سبق لك تضخيم ملف تنسيق.

يوضح مقتطف الرمز التالي كيفية إنشاء مثيل Scene من العنصر الجذر للمشهد والتسلسل الهرمي لطريقة العرض للمشهد في الرمز البرمجي الخاص بك:

Kotlin

val sceneRoot = someLayoutElement as ViewGroup
val viewHierarchy = someOtherLayoutElement as ViewGroup
val scene: Scene = Scene(sceneRoot, viewHierarchy)

Java

Scene mScene;

// Obtain the scene root element.
sceneRoot = (ViewGroup) someLayoutElement;

// Obtain the view hierarchy to add as a child of
// the scene root when this scene is entered.
viewHierarchy = (ViewGroup) someOtherLayoutElement;

// Create a scene.
mScene = new Scene(sceneRoot, mViewHierarchy);

إنشاء إجراءات المشهد

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

تكون إجراءات المَشاهد مفيدة للتعامل مع الحالات التالية:

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

لتوفير إجراءات مشهد مخصّصة، حدِّد الإجراءات التي تنفّذها على أنّها كائنات Runnable وأرسِلها إلى دالة Scene.setExitAction() أو Scene.setEnterAction(). يستدعي إطار العمل الدالة setExitAction() في مشهد البداية قبل تشغيل الحركة الانتقالية ودالة setEnterAction() في مشهد النهاية بعد تشغيل الحركة الانتقالية.

تطبيق تأثير انتقال

يمثّل إطار عمل الانتقال نمط الصور المتحركة بين المشاهد باستخدام كائن Transition. يمكنك إنشاء مثيل لـ Transition باستخدام فئات فرعية مضمّنة، مثل AutoTransition وFade، أو تحديد عملية انتقال خاصة بك. بعد ذلك، يمكنك تشغيل الرسوم المتحركة بين المشاهد من خلال تمرير النهاية Scene وTransition إلى TransitionManager.go().

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

إنشاء عملية انتقال

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

الجدول 1. أنواع الانتقالات المُدمَجة

الفئة الإشارة إلى المنتج التأثير
AutoTransition <autoTransition/> الانتقال التلقائي يتلاشى، ويتحرك، ويغير حجمه، ويتلاشى في طرق العرض، بهذا الترتيب.
ChangeBounds <changeBounds/> نقل طرق العرض وتغيير حجمها
ChangeClipBounds <changeClipBounds/> لتسجيل View.getClipBounds() قبل تغيير المشهد وبعده، وتحريك تلك التغييرات أثناء الانتقال.
ChangeImageTransform <changeImageTransform/> تسجّل مصفوفة ImageView قبل تغيير المشهد وبعده وتحريكه أثناء الانتقال.
ChangeScroll <changeScroll/> تسجّل خصائص التمرير للأهداف قبل تغيير المشهد وبعده وتحريك أي تغييرات.
ChangeTransform <changeTransform/> يتم تسجيل حجم المشاهدات وتدويرها قبل تغيير المشهد وبعده وتحريك هذه التغييرات أثناء الانتقال.
Explode <explode/> يتم تتبُّع التغييرات في مستوى رؤية المشاهدات المستهدَفة في مشهد البداية والنهاية، وينقل المشاهدات داخل المشهد أو خارجه.
Fade <fade/> يتلاشى fade_in في طرق العرض.
يتلاشى fade_out للمشاهدات.
تتّبع السمة fade_in_out (الخيار التلقائي) السمة fade_out متبوعة بالسمة fade_in.
Slide <slide/> يتم تتبُّع التغييرات في مستوى رؤية المشاهدات المستهدَفة في مشهدَي البداية والنهاية، كما يتم نقل المشاهدات داخل أحد أطراف المشهد أو خارجه.

إنشاء مثيل انتقال من ملف مورد

تتيح لك هذه التقنية تعديل تعريف الانتقال دون تغيير رمز نشاطك. تفيد هذه التقنية أيضًا في فصل تعريفات النقل المعقّدة عن رمز التطبيق، كما هو موضَّح في القسم المتعلّق بتحديد عمليات النقل المتعدّدة.

لتحديد عملية نقل مضمّنة في ملف مورد، اتّبِع الخطوات التالية:

  • أضِف دليل res/transition/ إلى مشروعك.
  • أنشِئ ملف موارد XML جديدًا داخل هذا الدليل.
  • أضِف عقدة XML لإحدى عمليات الانتقال المضمّنة.

على سبيل المثال، يحدِّد ملف الموارد التالي عملية النقل باستخدام Fade:

res/transition/fade_transition.xml

<fade xmlns:android="http://schemas.android.com/apk/res/android" />

يعرض مقتطف الرمز التالي كيفية تضخيم مثيل Transition داخل نشاطك من ملف مورد:

Kotlin

var fadeTransition: Transition =
    TransitionInflater.from(this)
                      .inflateTransition(R.transition.fade_transition)

Java

Transition fadeTransition =
        TransitionInflater.from(this).
        inflateTransition(R.transition.fade_transition);

إنشاء مثيل انتقالي في الرمز البرمجي الخاص بك

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

لإنشاء مثيل لانتقال مضمّن، استدعِ أحد دوال الإنشاء العامة في الفئات الفرعية للفئة Transition. على سبيل المثال، ينشئ مقتطف الرمز التالي مثيلاً لانتقال Fade:

Kotlin

var fadeTransition: Transition = Fade()

Java

Transition fadeTransition = new Fade();

تطبيق تأثير انتقال

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

لتغيير مشهد أثناء تطبيق تأثير انتقالي استجابةً لحدث في نشاطك، استدعِ دالة الفئة TransitionManager.go() بمشهد النهاية وحالة الانتقال لاستخدامها في الحركة، كما هو موضَّح في المقتطف التالي:

Kotlin

TransitionManager.go(endingScene, fadeTransition)

Java

TransitionManager.go(endingScene, fadeTransition);

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

إذا لم تحدد حالة انتقالية، يمكن لمدير الانتقال تطبيق انتقال تلقائي ينفذ إجراءً معقولاً لمعظم المواقف. لمزيد من المعلومات، يُرجى الاطّلاع على مرجع واجهة برمجة التطبيقات للفئة TransitionManager.

اختيار طرق عرض مستهدفة محددة

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

يُطلق على كل طريقة عرض يحرّكها الانتقال اسم هدف. يمكنك فقط تحديد الأهداف التي تشكل جزءًا من التسلسل الهرمي لطريقة العرض المرتبطة بمشهد.

لإزالة ملف شخصي واحد أو أكثر من قائمة الأهداف، عليك طلب الإجراء removeTarget() قبل بدء عملية النقل. لإضافة الملفات الشخصية التي تحدّدها فقط إلى قائمة الأهداف، عليك استدعاء الدالة addTarget(). للمزيد من المعلومات، يُرجى الاطّلاع على مرجع واجهة برمجة التطبيقات للفئة Transition.

تحديد عمليات انتقال متعددة

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

ولست مضطرًا لاختيار صورة متحركة واحدة فقط، لأنّ إطار عمل الانتقالات يتيح لك دمج تأثيرات الصور المتحركة في مجموعة انتقالات تتضمّن مجموعة من الانتقالات الفردية المضمّنة أو المخصّصة.

لتحديد مجموعة انتقالات من مجموعة من الانتقالات في XML، يمكنك إنشاء ملف مورد في دليل res/transitions/ وإدراج الانتقالات ضمن العنصر TransitionSet. على سبيل المثال، يوضِّح المقتطف التالي كيفية تحديد مجموعة انتقالية لها سلوك الفئة AutoTransition نفسه:

<transitionSet xmlns:android="http://schemas.android.com/apk/res/android"
    android:transitionOrdering="sequential">
    <fade android:fadingMode="fade_out" />
    <changeBounds />
    <fade android:fadingMode="fade_in" />
</transitionSet>

لتضخيم مجموعة الانتقال إلى كائن TransitionSet في الرمز، استدعِ دالة TransitionInflater.from() في نشاطك. تمتد الفئة TransitionSet من الفئة Transition، وبالتالي يمكنك استخدامها مع مدير نقل تمامًا مثل أي مثيل Transition آخر.

تطبيق تأثير انتقال بدون مشاهد

ليس تغيير هيكلية طرق العرض الطريقة الوحيدة لتعديل واجهة المستخدم. يمكنك أيضًا إجراء تغييرات من خلال إضافة طرق عرض فرعية وتعديلها وإزالتها ضمن التسلسل الهرمي الحالي.

على سبيل المثال، يمكنك تنفيذ تفاعل بحث بتنسيق واحد. ابدأ بالتخطيط الذي يعرض حقل إدخال بحث ورمز بحث. لتغيير واجهة المستخدم لعرض النتائج، أزِل زر البحث عندما ينقر المستخدم عليها من خلال استدعاء دالة ViewGroup.removeView() وأضِف نتائج البحث من خلال استدعاء الدالة ViewGroup.addView().

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

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

لإنشاء عملية انتقال متأخرة ضمن تسلسل هرمي واحد للعرض، اتّبِع الخطوات التالية:

  1. عند وقوع الحدث الذي يؤدي إلى عملية النقل، استدعِ الدالة TransitionManager.beginDelayedTransition()، وتوفر طريقة العرض الرئيسية لجميع طرق العرض التي تريد تغييرها وطريقة الانتقال لاستخدامها. يخزِّن إطار العمل الحالة الحالية للملفات الشخصية الفرعية وقيم خصائصها.
  2. عليك إجراء تغييرات على الملفات الشخصية الفرعية وفقًا لما تقتضيه حالة الاستخدام. ويسجل إطار العمل التغييرات التي تجريها على الملفات الشخصية الفرعية وخصائصها.
  3. عندما يعيد النظام رسم واجهة المستخدم وفقًا للتغييرات التي أجريتها، فإن إطار العمل يحرّك التغييرات بين الحالة الأصلية والحالة الجديدة.

يوضح المثال التالي كيفية إضافة طريقة عرض نص إلى تسلسل هرمي لطريقة العرض باستخدام انتقال متأخر. يعرض المقتطف الأول ملف تعريف التخطيط:

res/layout/activity_main.xml

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/mainLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    <EditText
        android:id="@+id/inputText"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent" />
    ...
</androidx.constraintlayout.widget.ConstraintLayout>

يعرض المقتطف التالي الرمز الذي يحرّك إضافة عرض النص:

MainActivity

Kotlin

setContentView(R.layout.activity_main)
val labelText = TextView(this).apply {
    text = "Label"
    id = R.id.text
}
val rootView: ViewGroup = findViewById(R.id.mainLayout)
val mFade: Fade = Fade(Fade.IN)
TransitionManager.beginDelayedTransition(rootView, mFade)
rootView.addView(labelText)

Java

private TextView labelText;
private Fade mFade;
private ViewGroup rootView;
...
// Load the layout.
setContentView(R.layout.activity_main);
...
// Create a new TextView and set some View properties.
labelText = new TextView(this);
labelText.setText("Label");
labelText.setId(R.id.text);

// Get the root view and create a transition.
rootView = (ViewGroup) findViewById(R.id.mainLayout);
mFade = new Fade(Fade.IN);

// Start recording changes to the view hierarchy.
TransitionManager.beginDelayedTransition(rootView, mFade);

// Add the new TextView to the view hierarchy.
rootView.addView(labelText);

// When the system redraws the screen to show this update,
// the framework animates the addition as a fade in.

تحديد عمليات معاودة الاتصال خلال مراحل نشاط الانتقال

تشبه دورة حياة الانتقال دورة حياة النشاط. ويمثّل الانتقال الحالات التي يراقبها إطار العمل خلال الفترة بين استدعاء الدالة TransitionManager.go() واكتمال الصورة المتحركة. في حالات دورة الحياة المهمة، يستدعي إطار العمل استدعاءات تحدِّدها واجهة TransitionListener.

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

لمزيد من المعلومات، يُرجى الاطّلاع على مرجع واجهة برمجة التطبيقات للفئة TransitionListener.

القيود

يسرد هذا القسم بعض القيود المعروفة لإطار عمل الانتقالات:

  • قد لا تظهر الصور المتحركة المطبَّقة على SurfaceView بشكلٍ صحيح. تم تعديل مثيلات SurfaceView من سلسلة محادثات لا تتضمّن واجهة المستخدم، وبالتالي قد لا تكون التحديثات متزامنة مع الصور المتحركة في طرق العرض الأخرى.
  • قد لا تنتج بعض أنواع الانتقالات المحددة تأثير الحركة المطلوب عند تطبيقها على TextureView.
  • تدير الصفوف التي توسّع نطاق AdapterView، مثل ListView، طرق العرض الفرعية بطرق لا تتوافق مع إطار عمل عمليات النقل. إذا حاولت إضافة تأثير متحرك إلى عرض استنادًا إلى AdapterView، قد تتوقف شاشة الجهاز عن الاستجابة.
  • إذا حاولت تغيير حجم TextView باستخدام صورة متحركة، سينبثق النص إلى مكان جديد قبل تغيير حجم العنصر بالكامل. لتجنب هذه المشكلة، لا تحرّك تغيير حجم طرق العرض التي تحتوي على نص.