האפליקציה צריכה לפעול בצורה טובה במכשירי Wear OS בכל הגדלים, לנצל את השטח הנוסף כשזמין, ועדיין להיראות מצוין גם במסכים קטנים יותר. במדריך הזה מפורטות המלצות שיעזרו לכם לספק חוויית משתמש כזו.
מידע נוסף על עקרונות העיצוב של פריסות דינמיות זמין בהנחיות העיצוב.
יצירת פריסות רספונסיביות באמצעות Material 3
פריסות צריכות לכלול שוליים שמבוססים על אחוזים. מכיוון ש-Compose פועל כברירת מחדל בערכים מוחלטים, צריך להשתמש ב-rememberResponsiveColumnPadding מספריית Horologist כדי לחשב את הריווח הפנימי ולהעביר אותו לפרמטר contentPadding של ScreenScaffold ולפרמטר contentPadding של TransformingLazyColumn.
בקטע הקוד הבא נעשה שימוש ברכיב TransformingLazyColumn כדי ליצור תוכן שנראה נהדר במגוון גדלים של מסכי Wear OS:
val columnState = rememberTransformingLazyColumnState() val transformationSpec = rememberTransformationSpec() ScreenScaffold( scrollState = columnState ) { contentPadding -> TransformingLazyColumn( state = columnState, contentPadding = contentPadding ) { item { ListHeader( modifier = Modifier .fillMaxWidth() .transformedHeight(this, transformationSpec) .minimumVerticalContentPadding(ListHeaderDefaults.minimumTopListContentPadding), transformation = SurfaceTransformation(transformationSpec) ) { Text(text = "Header") } } // ... other items item { Button( modifier = Modifier .fillMaxWidth() .transformedHeight(this, transformationSpec) .minimumVerticalContentPadding(ButtonDefaults.minimumVerticalListContentPadding), transformation = SurfaceTransformation(transformationSpec), onClick = { /* ... */ }, icon = { Icon( imageVector = Icons.Default.Build, contentDescription = "build", ) }, ) { Text( text = "Build", maxLines = 1, overflow = TextOverflow.Ellipsis, ) } } } }
בדוגמה הזו אפשר לראות גם את ScreenScaffold ואת AppScaffold.
הם מתואמים בין האפליקציה למסכים נפרדים (נתיבי ניווט) כדי להבטיח את התנהגות הגלילה הנכונה ואת המיקום של TimeText.
לגבי המרווח הפנימי העליון והתחתון, חשוב לשים לב גם לנקודות הבאות:
- המפרט של התו הראשון והאחרון
ItemType, כדי לקבוע את הריווח הנכון. - השימוש ב-
ListHeaderלפריט הראשון ברשימה, כי לכותרותTextלא צריך להיות ריווח פנימי.
המפרטים המלאים זמינים בערכות העיצוב של Figma. פרטים נוספים ודוגמאות זמינים במאמרים הבאים:
- ספריית Horologist – מספקת כלים שימושיים לפיתוח אפליקציות מותאמות ומובחנות ל-Wear OS.
- הדוגמה ComposeStarter – דוגמה שמציגה את העקרונות שמתוארים במדריך הזה.
- הדוגמה JetCaster – דוגמה מורכבת יותר ליצירת אפליקציה שתפעל בגדלי מסך שונים, באמצעות ספריית Horologist.
שימוש בפריסות עם גלילה באפליקציה
שימוש בפריסה עם גלילה, כמו שמוצג קודם בדף הזה, כאפשרות ברירת המחדל כשמטמיעים את המסכים. כך המשתמשים יכולים לגשת לרכיבים של האפליקציה בלי קשר להעדפות התצוגה או לגודל המסך של מכשיר Wear OS.
ההשפעה של גדלי מכשירים שונים ושל שינוי גודל הגופן.
תיבות דו-שיח
בנוסף, תיבות דו-שיח צריכות להיות ניתנות לגלילה, אלא אם יש סיבה טובה מאוד לכך שלא.
הרכיב AlertDialog הוא רספונסיבי, ואפשר לגלול אותו כברירת מחדל אם התוכן חורג מגובה אזור התצוגה.
יכול להיות שבמסכים בהתאמה אישית תצטרכו פריסות שלא מאפשרות גלילה
יכול להיות שחלק מהמסכים עדיין יתאימו לפריסות ללא גלילה. כמה דוגמאות כוללות את מסך הנגן הראשי באפליקציית מדיה ואת מסך האימון באפליקציית כושר.
במקרים כאלה, כדאי לעיין בהנחיות הקנוניות שמופיעות בערכות העיצוב של Figma ולהטמיע עיצוב רספונסיבי לגודל המסך, תוך שימוש בשוליים הנכונים.
הגדרת נקודות עצירה כדי לספק חוויות שונות
במסכים גדולים יותר, אפשר להציג תוכן ותכונות נוספים. כדי להטמיע חוויה מובחנת כזו, משתמשים בנקודות עצירה (breakpoints) של גודל המסך, ומציגים פריסה שונה כשגודל המסך גדול מ-225dp:
const val LARGE_DISPLAY_BREAKPOINT = 225 @Composable fun isLargeDisplay() = LocalConfiguration.current.screenWidthDp >= LARGE_DISPLAY_BREAKPOINT // ... // ... use in your Composables: if (isLargeDisplay()) { // Show additional content. } else { // Show content only for smaller displays. } // ...
הנחיות העיצוב מציגות עוד הזדמנויות כאלה.
בדיקת שילובים של גדלי מסך וגופנים באמצעות תצוגות מקדימות
תצוגות מקדימות של קומפוזיציה עוזרות לפתח אפליקציות למגוון גדלים של מסכים ב-Wear OS. כדי לראות את הפרטים הבאים, משתמשים בהגדרות התצוגה המקדימה של המכשירים ושל שינוי גודל הגופן:
- איך המסכים נראים כשמשתמשים בגדלים קיצוניים, למשל, הגופן הכי גדול בשילוב עם המסך הכי קטן.
- איך חוויית המשתמש השונה מתנהגת בנקודות עצירה שונות.
חשוב להטמיע תצוגות מקדימות באמצעות WearPreviewDevices ו-WearPreviewFontScales לכל המסכים באפליקציה. לפרטים מלאים על הגדרת תצוגות מקדימות של Wear OS, מפרטי חומרה בהתאמה אישית ותצוגה מקדימה של רשימות עם גלילה, אפשר לעיין במאמר תצוגה מקדימה של ממשק המשתמש ב-Compose ל-Wear OS.
@WearPreviewDevices @WearPreviewFontScales @Composable fun ComposeListPreview() { ComposeList() }
בדיקת צילומי מסך
בנוסף לבדיקה בתצוגה מקדימה, בדיקת צילומי מסך מאפשרת לכם לבדוק מול מגוון גדלים של חומרה קיימת. זה שימושי במיוחד במקרים שבהם המכשירים האלה לא זמינים לכם באופן מיידי, והבעיה לא מופיעה בגדלים אחרים של מסכים.
בנוסף, בדיקות צילומי מסך עוזרות לכם לזהות רגרסיות במיקומים ספציפיים בבסיס הקוד.
בדוגמאות שלנו אנחנו משתמשים ב-Roborazzi לבדיקת צילומי מסך:
- מגדירים את קובצי הפרויקט והאפליקציה
build.gradleלשימוש ב-Roborazzi. - יוצרים בדיקת צילומי מסך לכל מסך באפליקציה. לדוגמה, הקוד הבא מציג בדיקת צילומי מסך למסך שמכיל רשימה:
@RunWith(ParameterizedRobolectricTestRunner::class) class ComposeListScreenTest( override val device: WearDevice ) : WearScreenshotTest() { override val tolerance = 0.02f @Test fun myScreenTest() = runTest { AppScaffold { ComposeList() } } companion object { @JvmStatic @ParameterizedRobolectricTestRunner.Parameters fun devices() = WearDevice.entries } }
כמה נקודות חשובות שכדאי לזכור:
-
WearDevice.entriesמכיל הגדרות לרוב מכשירי Wear OS הפופולריים, כדי שהבדיקות יפעלו על טווח מייצג של גדלי מסך.
יצירת תמונות מוזהבות
כדי ליצור תמונות למסכים, מריצים את הפקודה הבאה במסוף:
./gradlew recordRoborazziDebug
אימות התמונות
כדי לאמת שינויים בתמונות קיימות, מריצים את הפקודה הבאה במסוף:
./gradlew verifyRoborazziDebug
דוגמה מלאה לבדיקת צילומי מסך מופיעה בדוגמה ComposeStarter.