כשמציגים את Compose באפליקציה קיימת, צריך להעביר את העיצובים של Material XML כדי להשתמש ב-MaterialTheme לרכיבי Compose. זה אומר שלעיצוב של האפליקציה יהיו שני מקורות מידע: העיצוב שמבוסס על View והעיצוב של 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. לנתח את נתיב ההעברה ואת השלבים הנדרשים כדי להעביר את מערכת העיצוב הקיימת ל-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, מגדירים אובייקט
| תפקיד כתיבה | שם ה-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
- הגדרת הסגנון באופן עקיף ומרומז לרכיב כחלק מעיצוב גדול יותר (theme.xml)
לסגנונות אין מקבילה ישירה ב-Compose. במקום זאת, הסגנונות מועברים כפרמטרים או כמשתני שינוי לפונקציות ה-composable, באמצעות ה-Styles API החדש והניסיוני שמוגדר ב-AppTheme, או על ידי יצירת וריאציות של פונקציות composable בשכבות שניתן לעשות בהן שימוש חוזר עם הסגנון המוגדר.
צריך לספק פונקציות קומפוזביליות @Composable נפרדות שנקראות לפי הסגנון והרכיב הבסיסי, כדי לציין את ההבדל בסגנון ובמקרי השימוש של הרכיבים האלה.
- תבנית: אם רכיב XML משתמש בסגנון אישי (למשל,
style="@style/MyPrimaryButton"), אל תנסו לשכפל את הסגנון בתוך השורה. במקום זאת, הציעו ליצור פונקציה קומפוזבילית ספציפית. - לדוגמה:
- XML:
<Button style="@style/MyPrimaryButton" ... /> - כתיבה:
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 המקורי כמקור האמת להתאמת העיצוב של Google Material Design החדשה ב-Compose. כדי לשמור על עקביות המותג ולמנוע רגרסיות חזותיות, אל תמציאו ערכי עיצוב חדשים במהלך ההעברה.
מוודאים שכל ערכי העיצוב החדשים ב-Compose תואמים לערכי ה-XML הקיימים. אל תגדירו ערכים מועברים בתוך הקוד.