כדאי להטמיע באפליקציה מחוות של צביטה לשינוי גודל כדי לתמוך בתוכן שניתן להתאמה. זו השיטה הסטנדרטית והעקבית בפלטפורמה לשיפור הנגישות, והיא מאפשרת למשתמשים לשנות באופן אינטואיטיבי את הגודל של הטקסט ושל רכיבי ממשק המשתמש בהתאם לצרכים שלהם. באפליקציה אפשר להגדיר התנהגות מותאמת אישית של שינוי גודל עם שליטה מדויקת והתנהגות הקשרית שמציעה חוויה שהמשתמשים מגלים לעיתים קרובות מהר יותר מאשר תכונה ברמת המערכת כמו הגדלת המסך.
בחירה של אסטרטגיית הרחבה
האסטרטגיות שמוסברות במדריך הזה גורמות לממשק המשתמש להתעדכן ולהתארגן מחדש כדי להתאים לרוחב המסך. התכונה הזו משפרת באופן משמעותי את הנגישות, כי היא מבטלת את הצורך בהזזה אופקית ואת התנועה המעצבנת של 'זיגזג' שנדרשת כדי לקרוא שורות ארוכות של טקסט.
קריאה נוספת: מחקרים מאשרים שמשתמשים עם לקות ראייה יכולים לקרוא תוכן שמוצג בפריסה מחדש הרבה יותר בקלות, וגם לנווט בו בקלות רבה יותר, בהשוואה לממשקים שדורשים גלילה דו-ממדית. פרטים נוספים מופיעים במאמר השוואה בין תוכן שניתן להזזה ולשינוי גודל לבין תוכן שניתן להזזה ולשינוי גודל במכשירים ניידים.
שינוי הגודל של כל הרכיבים או רק של רכיבי הטקסט
בטבלה הבאה מוצגת ההשפעה החזותית של כל אסטרטגיית שינוי גודל.
| אסטרטגיה | שינוי גודל לפי צפיפות | שינוי גודל הגופן |
|---|---|---|
התנהגות |
הגדלה או הקטנה של כל הרכיבים באופן יחסי. התוכן מסתדר מחדש כדי להתאים למאגר שלו, כך שהמשתמש לא צריך להזיז את התצוגה אופקית כדי לראות את כל התוכן. |
ההגדרה משפיעה רק על רכיבי טקסט. הפריסה הכוללת והרכיבים שאינם טקסטואליים נשארים באותו גודל. |
מה אפשר להרחיב |
כל הרכיבים החזותיים: טקסט, רכיבים (לחצנים, סמלים), תמונות וריווח בפריסה (שוליים פנימיים, שוליים חיצוניים) |
טקסט בלבד |
הדגמה |
המלצות
אחרי שראיתם את ההבדלים בין התמונות, הטבלה הבאה תעזור לכם לשקול את היתרונות והחסרונות ולבחור את האסטרטגיה הכי טובה לתוכן שלכם.
UI type |
שיטה מומלצת |
הסבר |
פריסות שמתאימות לקריאה דוגמאות: כתבות חדשותיות, אפליקציות להעברת הודעות |
צפיפות או שינוי גודל הגופן |
מומלץ להשתמש בהתאמת צפיפות כדי לשנות את הגודל של כל אזור התוכן, כולל תמונות מוטבעות. אם צריך לשנות את גודל הטקסט בלבד, אפשר להשתמש בחלופה הפשוטה של שינוי גודל הגופן. |
פריסות עם מבנה ויזואלי דוגמאות: חנויות אפליקציות, פידים של רשתות חברתיות |
שינוי הצפיפות |
שומר על הקשרים החזותיים בין תמונות וטקסט בקרוסלות או ברשתות. התכונה של שינוי הפריסה מונעת גלילה אופקית, שהייתה מתנגשת עם אלמנטים של גלילה מוטמעת. |
זיהוי תנועות של שינוי קנה מידה ב-Jetpack פיתוח נייטיב
כדי לתמוך בתוכן שניתן להתאמה לגודל המסך, צריך קודם לזהות מחוות מגע מרובות. ב-Jetpack פיתוח נייטיב, אפשר לעשות את זה באמצעות Modifier.transformable.
המשנה transformable הוא API ברמה גבוהה שמספק את zoomChange
הדלתא מאז אירוע תנועת המגע האחרון. השימוש בשיטה הזו מפשט את הלוגיקה של עדכון המצב ומאפשר צבירה ישירה (לדוגמה, scale *= zoomChange), ולכן היא אידיאלית לשיטות של שינוי גודל דינמי שמוסברות במדריך הזה.
הטמעות לדוגמה
בדוגמאות הבאות אפשר לראות איך מטמיעים את האסטרטגיות של שינוי קנה מידה של הצפיפות ושינוי קנה מידה של הגופן.
שינוי גודל לפי צפיפות
בגישה הזו, המערכת משנה את גודל הבסיס density של אזור בממשק המשתמש. כתוצאה מכך, כל המדידות שמבוססות על פריסה – כולל ריווח פנימי, ריווח וגודלי רכיבים – עוברות שינוי קנה מידה, כאילו גודל המסך או הרזולוציה השתנו. גודל הטקסט תלוי גם בצפיפות, ולכן הוא משתנה באופן יחסי. השיטה הזו יעילה כשרוצים להגדיל באופן אחיד את כל הרכיבים באזור מסוים, תוך שמירה על הקצב החזותי והפרופורציות הכוללים של ממשק המשתמש.
private class DensityScalingState( // Note: For accessibility, typical min/max values are ~0.75x and ~3.5x. private val minScale: Float = 0.75f, private val maxScale: Float = 3.5f, private val currentDensity: Density ) { val transformableState = TransformableState { zoomChange, _, _ -> scaleFactor.floatValue = (scaleFactor.floatValue * zoomChange).coerceIn(minScale, maxScale) } val scaleFactor = mutableFloatStateOf(1f) fun scaledDensity(): Density { return Density( currentDensity.density * scaleFactor.floatValue, currentDensity.fontScale ) } }
שינוי גודל הגופן
השיטה הזו ממוקדת יותר, ומשנה רק את הגורם fontScale. התוצאה היא שרק רכיבי טקסט גדלים או קטנים, בעוד שכל שאר רכיבי הפריסה – כמו מאגרי מידע, ריווח וסמלים – נשארים בגודל קבוע. האסטרטגיה הזו מתאימה לשיפור קריאות הטקסט באפליקציות שדורשות קריאה רבה.
class FontScaleState( // Note: For accessibility, typical min/max values are ~0.75x and ~3.5x. private val minScale: Float = 0.75f, private val maxScale: Float = 3.5f, private val currentDensity: Density ) { val transformableState = TransformableState { zoomChange, _, _ -> scaleFactor.floatValue = (scaleFactor.floatValue * zoomChange).coerceIn(minScale, maxScale) } val scaleFactor = mutableFloatStateOf(1f) fun scaledFont(): Density { return Density( currentDensity.density, currentDensity.fontScale * scaleFactor.floatValue ) } }
ממשק משתמש משותף להדגמה
זהו רכיב ה-DemoCard המשותף שמשמש את שתי הדוגמאות הקודמות כדי להדגיש את התנהגויות ההתאמה השונות.
@Composable private fun DemoCard() { Card( modifier = Modifier .width(360.dp) .padding(16.dp), shape = RoundedCornerShape(12.dp) ) { Column( modifier = Modifier.padding(16.dp), verticalArrangement = Arrangement.spacedBy(16.dp) ) { Text("Demo Card", style = MaterialTheme.typography.headlineMedium) var isChecked by remember { mutableStateOf(true) } Row(verticalAlignment = Alignment.CenterVertically) { Text("Demo Switch", Modifier.weight(1f), style = MaterialTheme.typography.bodyLarge) Switch(checked = isChecked, onCheckedChange = { isChecked = it }) } Row(verticalAlignment = Alignment.CenterVertically) { Icon(Icons.Filled.Person, "Icon", Modifier.size(32.dp)) Spacer(Modifier.width(8.dp)) Text("Demo Icon", style = MaterialTheme.typography.bodyLarge) } Row( Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween ) { Box( Modifier .width(100.dp) .weight(1f) .height(80.dp) .background(Color.Blue) ) Box( Modifier .width(100.dp) .weight(1f) .height(80.dp) .background(Color.Red) ) } Text( "Demo Text: Lorem ipsum dolor sit amet, consectetur adipiscing elit," + " sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.", style = MaterialTheme.typography.bodyMedium, textAlign = TextAlign.Justify ) } } }
טיפים ושיקולים
כדי ליצור חוויה נעימה ונגישה יותר, כדאי ליישם את ההמלצות הבאות:
- כדאי להציע אמצעי שליטה לשינוי קנה מידה שאינם מבוססים על מחוות: יכול להיות שלחלק מהמשתמשים קשה לבצע מחוות. כדי לתמוך במשתמשים האלה, כדאי לספק דרך חלופית להתאמה או לאיפוס של קנה המידה שלא מסתמכת על מחוות.
- פיתוח לכל הגדלים: כדאי לבדוק את ממשק המשתמש גם בהגדלה בתוך האפליקציה וגם בהגדרות של הגופן או התצוגה ברמת המערכת. בודקים שהפריסות של האפליקציה מותאמות בצורה נכונה בלי לשבור, לחפוף או להסתיר תוכן. מידע נוסף על יצירת פריסות דינמיות