عند استخدام Compose في تطبيق حالي، عليك نقل سمات Material XML لاستخدام MaterialTheme لمكوّنات Compose. يعني ذلك أنّ سمات تطبيقك ستستند إلى مصدرَين: سمة مستندة إلى طريقة العرض وسمة Compose. يجب إجراء أي تغييرات على تصميمك في أماكن متعددة. بعد نقل تطبيقك بالكامل إلى Compose، عليك إزالة سمات XML.
يمكنك استخدام أداة Material Theme Builder لنقل الألوان.
عند بدء عملية نقل السمات من XML إلى Compose، عليك نقلها إلى سمات Material 3 Compose.
مسرد المصطلحات
| العبارة | التعريف |
|---|---|
MaterialTheme |
الدالة القابلة للإنشاء التي توفّر سمات (الألوان وأسلوب الخط والأشكال) لمكوّنات واجهة مستخدم Compose. |
Shapes |
كائن Compose يُستخدَم لتحديد أشكال مكوّنات مخصّصة لـ MaterialTheme. |
Typography |
كائن Compose يُستخدَم لتحديد أنماط نص مخصّصة (عائلات الخطوط وأحجامها وعرضها) لـ MaterialTheme. |
ColorScheme |
كائن Compose يُستخدَم لتحديد أنظمة ألوان مخصّصة لـ MaterialTheme. |
| سمة XML | نظام سمات Android المحدّد في ملفات XML، والذي يستخدمه نظام طريقة العرض. |
القيود
قبل النقل، يُرجى الانتباه إلى القيود التالية:
- يركّز هذا الدليل على النقل إلى Material 3 فقط. لنقل البيانات من أنظمة تصميم بديلة، يُرجى الاطّلاع على مقالة Material 2 أو أنظمة التصميم المخصّصة في Compose.
- الهدف النهائي هو النقل الكامل إلى Compose، ما يسمح بإزالة سمات XML. يوضّح هذا الدليل كيفية النقل، ولكن لا يوضّح كيفية إزالة سمات XML نهائيًا.
الخطوة 1: تقييم نظام التصميم
حدِّد نظام التصميم المستخدَم في مشروع XML View. حلِّل مسار النقل والخطوات اللازمة لنقل نظام التصميم الحالي إلى Material 3 في Compose.
الخطوة 2: تحديد ملفات مصدر السمة
في XML، يمكنك كتابة ?attr/colorPrimary. في Compose، يمكنك الوصول إلى قيم السمات باستخدام MaterialTheme.*:
حدِّد جميع ملفات وموارد XML اللازمة للسمات، مثل أنظمة الألوان الفاتحة والداكنة والمحدِّدات والسمات والأشكال والأبعاد وأسلوب الخط والأنماط والملفات الأخرى ذات الصلة، وحدِّد موقعها.
يمكن إعادة استخدام الموارد، مثل السلاسل، كما هي ولا يلزم نقلها.
الخطوة 3: نقل الألوان
المبدأ الأساسي: تستخدم XML ألوانًا سداسية عشرية مُسمّاة.
يستخدم Material 3 الأدوار الدلالية (مثل primary وonPrimary وsurface). توقَّف عن تسمية الألوان حسب قيمها السداسية العشرية، وسمِّها حسب دورها.
أمثلة:
| اسم اللون في XML | الدور في Material 3 |
|---|---|
colorPrimary |
primary |
colorPrimaryDark / colorPrimaryVariant |
primaryContainer أو secondary |
colorAccent |
secondary أو tertiary |
colorOnPrimary |
onPrimary |
android:colorBackground |
background |
colorSurface |
surface |
colorOnSurface |
onSurface |
colorError |
error |
colorOnError |
onError |
colorOutline |
outline |
colorSurfaceVariant |
surfaceVariant |
colorOnSurfaceVariant |
onSurfaceVariant |
انقل أنظمة الألوان الداكنة والفاتحة من XML إلى ما يعادلها في Material 3 Compose.
الخطوة 4: نقل الأشكال وأسلوب الخط المخصّصَين
إذا كان تطبيقك يستخدم أشكالاً مخصّصة:
- في رمز Compose، حدِّد كائن
Shapesلتكرار تعريفات الأشكال في XML. قدِّم كائن
Shapesهذا إلىMaterialTheme.لمزيد من التفاصيل، يُرجى الاطّلاع على الأشكال.
- في رمز Compose، حدِّد كائن
إذا كان تطبيقك يستخدم أسلوب خط مخصّص:
- في رمز Compose، حدِّد كائن
Typographyلتكرار أنماط النص وتعريفات الخطوط في تنسيق XML. قدِّم كائن
Typographyهذا إلىMaterialTheme.لمزيد من التفاصيل، يُرجى الاطّلاع على أسلوب الخط.
- في رمز Compose، حدِّد كائن
| الدور في Compose | الاسم في XML |
|---|---|
displayLarge |
TextAppearance.Material3.DisplayLarge |
displayMedium |
TextAppearance.Material3.DisplayMedium |
displaySmall |
TextAppearance.Material3.DisplaySmall |
headlineLarge |
TextAppearance.Material3.HeadlineLarge |
headlineMedium |
TextAppearance.Material3.HeadlineMedium |
headlineSmall |
TextAppearance.Material3.HeadlineSmall |
titleLarge |
TextAppearance.Material3.TitleLarge |
titleMedium |
TextAppearance.Material3.TitleMedium |
titleSmall |
TextAppearance.Material3.TitleSmall |
bodyLarge |
TextAppearance.Material3.BodyLarge |
bodyMedium |
TextAppearance.Material3.BodyMedium |
bodySmall |
TextAppearance.Material3.BodySmall |
labelLarge |
TextAppearance.Material3.LabelLarge |
labelMedium |
TextAppearance.Material3.LabelMedium |
labelSmall |
TextAppearance.Material3.LabelSmall |
الخطوة 5: نقل الأنماط (styles.xml)
يحدِّد نظام أنماط XML (styles.xml) أنماط ومظهر ما يلي:
- البرامج المصغّرة والمكوّنات والسمات للنوافذ ومربّعات الحوار
- أسلوب الخط
- السمات والتراكبات
- الأشكال
تجمع طرق العرض والمكوّنات في XML بين سمات متعددة لإنشاء نمط. ويتم ضبط أنماطها من styles.xml بطريقتَين مختلفتَين:
- ضبط "style="@style/..." مباشرةً وبشكل صريح في XML View
- ضبط النمط بشكل غير مباشر وضمني لمكوّن كجزء من سمة أكبر (theme.xml)
لا تتوفّر أنماط مكافئة مباشرةً في Compose، ولكن يتم بدلاً من ذلك تمرير الأنماط كـ: مَعلمات أو معدِّلات إلى الدوال القابلة للإنشاء، باستخدام Styles API التجريبية الجديدة المحدّدة في AppTheme، أو من خلال إنشاء أشكال مختلفة قابلة للإنشاء وقابلة لإعادة الاستخدام ومتراكبة مع النمط المحدّد.
قدِّم دوال @Composable منفصلة مُسمّاة وفقًا للنمط والمكوّن الأساسي، للإشارة إلى الاختلاف في التصميم وحالات الاستخدام لهذه المكوّنات.
- النمط: إذا كان أحد عناصر XML يستخدم نمطًا مخصّصًا
(مثل
style="@style/MyPrimaryButton")، لا تحاول تكرار النمط مضمّنًا. بدلاً من ذلك، ننصحك بإنشاء دالة قابلة للإنشاء محدّدة. - مثال:
- XML:
<Button style="@style/MyPrimaryButton" ... /> - Compose:
MyPrimaryButton(onClick = { ... })
- XML:
- مجموعات السمات الشائعة: إذا كان النمط يضبط معدِّلات شائعة (مثل المساحة الداخلية + الارتفاع)، استخرِجها إلى سمة إضافة قابلة للقراءة أو متغيّر `Modifier` مشترك.
أمثلة شائعة
| XML | إنشاء |
|---|---|
Theme.Material3.* |
MaterialTheme(colorScheme, typography, shapes) { } |
TextAppearance.Material3.BodyMedium |
TextStyle(...) المحدّد في Typography(bodyMedium = ...) |
ShapeAppearance.*.SmallComponent |
Shapes(small = RoundedCornerShape(X.dp)) |
Widget.Material3.Button |
Button(colors = ButtonDefaults.buttonColors(...)) |
Widget.Material3.CardView |
Card(shape=..., elevation=..., colors=...) |
Widget.*.TextInputLayout.OutlinedBox |
OutlinedTextField(colors = OutlinedTextFieldDefaults.colors(...)) |
Widget.*.Chip.Filter |
FilterChip(colors = FilterChipDefaults.filterChipColors(...)) |
Widget.*.Toolbar.Primary |
TopAppBar(colors = TopAppBarDefaults.topAppBarColors(...)) |
Widget.*.FloatingActionButton |
FloatingActionButton(containerColor = ...) |
backgroundTint |
containerColor في ComponentDefaults.ComponentColors() |
android:textColor |
contentColor في ComponentDefaults.ComponentColors() |
cornerRadius |
shape = RoundedCornerShape(X.dp) |
android:elevation |
elevation = ComponentDefaults.elevation(defaultElevation = X.dp) |
android:padding |
contentPadding = PaddingValues(...) أو Modifier.padding() |
android:minHeight |
Modifier.heightIn(min = X.dp) |
strokeColor + strokeWidth |
border = BorderStroke(width, color) |
android:textSize |
fontSize = X.sp في TextStyle |
الخطوة 6: التحقّق من عملية نقل السمات
يجب دائمًا استخدام قيم السمات الحالية من سمة XML الأصلية كمصدر موثوق لسمة Material الجديدة في Compose. لا تنشئ قيم سمات جديدة أثناء نقل البيانات للحفاظ على اتساق العلامة التجارية وتجنُّب التراجع المرئي.
تأكَّد من أنّ جميع قيم سمات Compose الجديدة تتطابق مع قيم XML الحالية. لا تبرمج أي قيم تم نقلها بشكل ثابت.