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

تجربة طريقة ComposeAllowed
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 باستخدام صورة متحركة، ينبثق النص إلى مكان جديد قبل تغيير حجم العنصر بالكامل. لتجنُّب هذه المشكلة، لا تحرّك تغيير حجم طرق العرض التي تحتوي على نص.