MotionLayout
هو نوع تنسيق يساعدك في إدارة الحركة والرسوم المتحركة للتطبيقات المصغّرة في تطبيقك.
MotionLayout هو فئة فرعية من
ConstraintLayout ويستند إلى إمكانات التنسيق الغنية. كجزء من مكتبة ConstraintLayout، يتوفّر MotionLayout
كمكتبة دعم.
يسدّ MotionLayout الفجوة بين انتقالات التنسيق ومعالجة الحركات المعقدة، ويقدّم مزيجًا من الميزات بين إطار عمل التحريك في الموقع الإلكتروني وTransitionManager وCoordinatorLayout.
بالإضافة إلى وصف الانتقالات بين التنسيقات، تتيح لك MotionLayout
إضافة مؤثرات متحركة إلى أيّ سمات تنسيق. بالإضافة إلى ذلك، يتيح هذا التنسيق بشكلٍ أساسي عمليات التحوّل التي يمكن تقديمها أو تأخيرها. وهذا يعني أنّه يمكنك عرض أي نقطة في الانتقال على الفور
استنادًا إلى بعض الشروط، مثل الإدخال باللمس. تتيح MotionLayout أيضًا استخدام
اللقطات الرئيسية، ما يتيح لك إنشاء انتقالات مخصّصة بالكامل لتلبية احتياجاتك.
MotionLayout هو تنسيق وصفي بالكامل، ما يعني أنّه يمكنك وصف أي انتقالات في
XML، بغض النظر عن مدى تعقيدها.
اعتبارات التصميم
يهدف MotionLayout إلى نقل عناصر واجهة المستخدم التي يتفاعل معها
المستخدمون وتغيير حجمها وإضافة تأثيرات متحركة إليها، مثل الأزرار وأشرطة العناوين. لا تستخدِم الصور المتحركة في تطبيقك كهامش مجاني لتأثير خاص. استخدِم هذه الميزة لمساعدة المستخدمين في فهم ما يفعله تطبيقك. لمزيد من المعلومات عن تصميم تطبيقك باستخدام الصور المتحركة، يُرجى الاطّلاع على القسم المخصص لتصميم المواد فهم
الصور المتحركة.
البدء
اتّبِع الخطوات التالية لبدء استخدام MotionLayout في مشروعك.
-
إضافة التبعية
ConstraintLayout: لاستخدامMotionLayoutفي مشروعك، أضِف تبعيةConstraintLayout2.0 إلىملفbuild.gradleفي تطبيقك. إذا كنت تستخدم AndroidX، أضِف التبعية التالية:Groovy
dependencies { implementation "androidx.constraintlayout:constraintlayout:2.2.1" // To use constraintlayout in compose implementation "androidx.constraintlayout:constraintlayout-compose:1.1.1" }
Kotlin
dependencies { implementation("androidx.constraintlayout:constraintlayout:2.2.1") // To use constraintlayout in compose implementation("androidx.constraintlayout:constraintlayout-compose:1.1.1") }
-
إنشاء ملف
MotionLayout:MotionLayoutهو فئة فرعية منConstraintLayout، لذا يمكنك تحويل أيConstraintLayoutحالي إلىMotionLayoutمن خلال استبدال اسم الفئة في ملف مرجع التنسيق، كما هو موضّح في المثالين التاليين:AndroidX
<!-- before: ConstraintLayout --> <androidx.constraintlayout.widget.ConstraintLayout .../> <!-- after: MotionLayout --> <androidx.constraintlayout.motion.widget.MotionLayout .../>
مكتبة الدعم
<!-- before: ConstraintLayout --> <android.support.constraint.ConstraintLayout .../> <!-- after: MotionLayout --> <android.support.constraint.motion.MotionLayout .../>
في ما يلي مثال كامل على ملف
MotionLayout، والذي يحدّد التنسيق الموضّح في الشكل 1:AndroidX
<?xml version="1.0" encoding="utf-8"?> <!-- activity_main.xml --> <androidx.constraintlayout.motion.widget.MotionLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/motionLayout" android:layout_width="match_parent" android:layout_height="match_parent" app:layoutDescription="@xml/scene_01" tools:showPaths="true"> <View android:id="@+id/button" android:layout_width="64dp" android:layout_height="64dp" android:background="@color/colorAccent" android:text="Button" /> </androidx.constraintlayout.motion.widget.MotionLayout>
مكتبة الدعم
<?xml version="1.0" encoding="utf-8"?> <!-- activity_main.xml --> <android.support.constraint.motion.MotionLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/motionLayout" android:layout_width="match_parent" android:layout_height="match_parent" app:layoutDescription="@xml/scene_01" tools:showPaths="true"> <View android:id="@+id/button" android:layout_width="64dp" android:layout_height="64dp" android:background="@color/colorAccent" android:text="Button" /> </android.support.constraint.motion.MotionLayout>
-
إنشاء MotionScene: في المثال السابق
MotionLayout، تشير السمةapp:layoutDescriptionإلى مشهد متحرك. مشهد الحركة هو ملفّ مرجعي بتنسيق XML. ضمن العنصر الجذر<MotionScene>للمشهد المتحرّك، يحتوي على جميع أوصاف الحركة لتخطيطه المناظر. لإبقاء معلومات التنسيق منفصلة عن أوصاف التحريك ، يشير كلMotionLayoutإلى مشهد التحريك منفصل. تُعطى الأولوية للتعريفات الواردة في مشهد الحركة على أي تعريفات مشابهة فيMotionLayout.في ما يلي مثال على ملف مشهد متحرّك يصف الحركة الأساسية الأفقية في الشكل 1:
<?xml version="1.0" encoding="utf-8"?> <MotionScene xmlns:android="http://schemas.android.com/apk/res/android" xmlns:motion="http://schemas.android.com/apk/res-auto"> <Transition motion:constraintSetStart="@+id/start" motion:constraintSetEnd="@+id/end" motion:duration="1000"> <OnSwipe motion:touchAnchorId="@+id/button" motion:touchAnchorSide="right" motion:dragDirection="dragRight" /> </Transition> <ConstraintSet android:id="@+id/start"> <Constraint android:id="@+id/button" android:layout_width="64dp" android:layout_height="64dp" android:layout_marginStart="8dp" motion:layout_constraintBottom_toBottomOf="parent" motion:layout_constraintStart_toStartOf="parent" motion:layout_constraintTop_toTopOf="parent" /> </ConstraintSet> <ConstraintSet android:id="@+id/end"> <Constraint android:id="@+id/button" android:layout_width="64dp" android:layout_height="64dp" android:layout_marginEnd="8dp" motion:layout_constraintBottom_toBottomOf="parent" motion:layout_constraintEnd_toEndOf="parent" motion:layout_constraintTop_toTopOf="parent" /> </ConstraintSet> </MotionScene>
ملاحظات:
-
يحتوي
<Transition>على التعريف الأساسي للحركة.-
motion:constraintSetStartوmotion:constraintSetEndهما إشارة إلى نقاط نهاية الحركة. يتم تحديد نقاط النهاية هذه في عناصر<ConstraintSet>لاحقًا في مشهد الحركة. -
motion:durationتحدّد عدد المللي ثانية التي تستغرقها الحركة لإكمالها.
-
-
<OnSwipe>يتيح لك إنشاء عنصر تحكّم باللمس للحركة.-
يشير الرمز
motion:touchAnchorIdإلى طريقة العرض التي يمكن للمستخدم تمريرها سريعًا وسحبها. -
يشير الرمز
motion:touchAnchorSideإلى أنّه تتم سحب طريقة العرض من الجانب الأيمن. -
يشير الرمز
motion:dragDirectionإلى اتجاه السحب. على سبيل المثال،motion:dragDirection="dragRight"يعني أنّ التقدّم يزداد عند سحب العرض إلى اليمين.
-
-
<ConstraintSet>هو المكان الذي تحدِّد فيه القيود المختلفة التي تصف حركتك. في هذا المثال، تم تحديد<ConstraintSet>واحد لكل نقطة نهاية من نقاط الحركة. يتم وضع نقاط النهاية هذه في المنتصف عموديًا باستخدامapp:layout_constraintTop_toTopOf="parent"وapp:layout_constraintBottom_toBottomOf="parent". أفقيًا، تكون نقاط النهاية في أقصى يمين الشاشة ويسارها.
للحصول على نظرة أكثر تفصيلاً على العناصر المختلفة التي يتيح استخدامها في مشهد الحركة، اطّلِع على أمثلة على MotionLayout.
-
السمات التي تمّت الاستقراء فيها
ضمن ملف مشهد متحرك، يمكن أن تحتوي عناصر ConstraintSet على سمات إضافية
يتم تجميعها أثناء الانتقال. بالإضافة إلى موضع العنصر وحدود
، يتمّ الاستبدال بين السمات التالية باستخدام MotionLayout:
alphavisibilityelevation- "
rotation" و"rotationX" و"rotationY" - "
translationX" و"translationY" و"translationZ" - "
scaleX" و"scaleY"
سمات مخصصة
ضمن <Constraint>، يمكنك استخدام العنصر <CustomAttribute> لتحديد
انتقال للسمات التي لا ترتبط ببساطة بموقعها أو سماتView.
<Constraint android:id="@+id/button" ...> <CustomAttribute motion:attributeName="backgroundColor" motion:customColorValue="#D81B60"/> </Constraint>
يحتوي <CustomAttribute> على سمتَين:
- يجب أن يكون العنصر
motion:attributeNameمطلوبًا وأن يتطابق مع كائن يتضمّن طريقتَي getter و setter. يجب أن يتطابقا مع نمط معيّن. على سبيل المثال، يُسمح باستخدامbackgroundColorلأنّ طريقة العرض تتضمّنgetBackgroundColor()وsetBackgroundColor(). - تستند السمة الأخرى التي يجب تقديمها إلى نوع القيمة. اختَر من بين
الأنواع المتوافقة التالية:
-
motion:customColorValueللألوان -
motion:customIntegerValueللأعداد الصحيحة motion:customFloatValueللعناصر العائمة-
motion:customStringValueللسلاسل motion:customDimensionللسمات-
motion:customBooleanللقيم المنطقية
-
عند تحديد سمة مخصّصة، حدِّد قيم نقاط النهاية في كلّ من عنصرَي start و
end <ConstraintSet>.
تغيير لون الخلفية
استنادًا إلى المثال السابق، لنفترض أنّك تريد تغيير ألوان العرض كجزء من حركته، كما هو موضّح في الشكل 2.
أضِف عنصر <CustomAttribute> إلى كل عنصر ConstraintSet، كما هو موضّح في
مقتطف الرمز البرمجي التالي:
<ConstraintSet android:id="@+id/start"> <Constraint android:id="@+id/button" android:layout_width="64dp" android:layout_height="64dp" android:layout_marginStart="8dp" motion:layout_constraintBottom_toBottomOf="parent" motion:layout_constraintStart_toStartOf="parent" motion:layout_constraintTop_toTopOf="parent"> <CustomAttribute motion:attributeName="backgroundColor" motion:customColorValue="#D81B60" /> </Constraint> </ConstraintSet> <ConstraintSet android:id="@+id/end"> <Constraint android:id="@+id/button" android:layout_width="64dp" android:layout_height="64dp" android:layout_marginEnd="8dp" motion:layout_constraintBottom_toBottomOf="parent" motion:layout_constraintEnd_toEndOf="parent" motion:layout_constraintTop_toTopOf="parent"> <CustomAttribute motion:attributeName="backgroundColor" motion:customColorValue="#9999FF" /> </Constraint> </ConstraintSet>
سمات MotionLayout الإضافية
بالإضافة إلى السمات الواردة في المثال السابق، تحتوي MotionLayout على
سمات أخرى قد تحتاج إلى تحديدها:
- يشير
app:applyMotionScene="boolean"إلى ما إذا كان سيتم تطبيق المشهد الذي يتضمّن حركة. القيمة التلقائية لهذه السمة هيtrue. - يشير
app:showPaths="boolean"إلى ما إذا كان سيتم عرض مسارات الحركة أثناء تشغيلها. القيمة التلقائية لهذه السمة هيfalse. - يتيح لك الخيار
app:progress="float"تحديد مستوى تقدّم الانتقال بوضوح. يمكنك استخدام أي قيمة عددية عشرية من0(بداية الانتقال) إلى1(نهاية الانتقال). - تسمح لك القيمة
app:currentState="reference"بتحديدConstraintSetمعيّن. - يتيح لك الخيار
app:motionDebugعرض معلومات إضافية لتصحيح الأخطاء المتعلّقة بالملفّ المتحرك. القيم المحتمَلة هي"SHOW_PROGRESS"أو"SHOW_PATH"أو"SHOW_ALL".
مصادر إضافية
لمزيد من المعلومات عن MotionLayout، يمكنك الاطّلاع على المراجع التالية:
- الميزات المتقدّمة في Android باستخدام Kotlin 03.2: إضافة صور متحركة باستخدام MotionLayout
- أمثلة على MotionLayout
- نماذج MotionLayout/ConstraintLayout على GitHub
- مقدمة عن MotionLayout (الجزء الأول)
- مقدّمة عن MotionLayout (الجزء الثاني)
- مقدّمة عن MotionLayout (الجزء الثالث)
- مقدّمة عن أداة MotionLayout (الجزء الرابع)