חדשות על מוצרים

המסכים המחוברים למכשירי Android פועלים בצורה חלקה

משך הקריאה: 7 דקות
Francesco Romano
מהנדס קשרי מפתחים, Android

אנחנו שמחים לבשר על אבן דרך משמעותית בקירוב בין מחשוב בנייד למחשוב בשולחן העבודה ב-Android: תמיכה במסכים מחוברים זמינה לכולם עם הגרסה Android 16 QPR3!

כפי שהוצג ב- Google I/O 2025, מסכים מחוברים מאפשרים למשתמשים לחבר את מכשירי Android שלהם למסך חיצוני ולקבל גישה מיידית לסביבת חלונות של מחשב שולחני. אפשר להשתמש באפליקציות בחלונות חופשיים או בחלונות מוגדלים, והמשתמשים יכולים לבצע ריבוי משימות כמו במערכת הפעלה למחשב.

‫Google ו-Samsung שיתפו פעולה כדי לספק חוויית שימוש חלקה ועוצמתית בממשק מחשב במכשירים שפועלת בהם מערכת Android 16 בסביבת Android, כשהם מחוברים למסך חיצוני. 
התכונה זמינה עכשיו לכלל המשתמשים במכשירים נתמכים*, שמאפשרת להם לחבר את טלפוני Pixel ו-Samsung הנתמכים שלהם לצגים חיצוניים. כך הם יכולים ליצור הזדמנויות חדשות לבניית חוויות שימוש באפליקציות שהן יותר מעניינות ויותר פרודוקטיביות, ומתאימות למגוון גורמי צורה.

איך זה עובד

כשמחברים טלפון או מכשיר מתקפל עם Android שנתמכים לכך לצג חיצוני, מתחיל סשן חדש של מחשב בצג המחובר.

החוויה במסך המחובר דומה לחוויה במחשב, כולל סרגל משימות שבו מוצגות אפליקציות פעילות ומאפשר למשתמשים להצמיד אפליקציות לגישה מהירה. המשתמשים יכולים להפעיל כמה אפליקציות זו לצד זו בו-זמנית בחלונות שניתן לשנות את הגודל שלהם באופן חופשי במסך המחובר.

materialDisplay.gif

הטלפון מחובר למסך חיצוני עם סשן של מחשב בשולחן העבודה שמוצג במסך, בזמן שהטלפון שומר על המצב שלו.

כשמחברים מכשיר שתומך בממשק מחשב (כמו טאבלט Samsung Galaxy Tab S11) למסך חיצוני, סשן המחשב מורחב לשני המסכים, ומתקבל סביבת עבודה רחבה עוד יותר. שני המסכים פועלים כמערכת אחת רציפה, ומאפשרים לחלונות של אפליקציות, לתוכן ולסמן לעבור בחופשיות בין המסכים.

materialDisplay2.gif

טאבלט שמחובר למסך חיצוני, והסשן של שולחן העבודה נפרס על שני המסכים.

למה זה חשוב?

בגרסה Android 16 QPR3, סיימנו את ההתנהגויות של חלונות, את האינטראקציות עם סרגל המשימות ואת התאימות של הקלט (עכבר ומקלדת) שמגדירים את חוויית השימוש בצג מחובר. הוספנו גם אמצעים לשיפור התאימות כדי לשנות את גודל החלונות ולמנוע הפעלה מחדש של האפליקציות כשעוברים בין מסכים.


אם האפליקציה שלכם מבוססת על עקרונות של עיצוב מותאם, היא תיראה ותפעל כמו אפליקציה למחשב באופן אוטומטי, והמשתמשים ירגישו בה בנוח. אם האפליקציה נעולה למצב אנכי או מניחה ממשק מגע בלבד, עכשיו זה הזמן לעדכן אותה.

חשוב במיוחד לשים לב לשיטות המומלצות העיקריות האלה כדי ליצור חוויית שימוש אופטימלית באפליקציות במסכים מחוברים:

  • אל תניחו שקיים אובייקט Display קבוע: האובייקט Display שמשויך להקשר של האפליקציה יכול להשתנות כשחלון של אפליקציה מועבר לתצוגה חיצונית או אם הגדרות התצוגה משתנות. האפליקציה צריכה לטפל בצורה חלקה באירועים של שינוי הגדרות ולשאול על מדדי הצגת המודעות באופן דינמי במקום לשמור אותם במטמון.
  • התאמה לשינויים בתצורת הצפיפות:: לצגים חיצוניים יכולות להיות רמות צפיפות שונות מאוד של פיקסלים בהשוואה למסך המכשיר הראשי. כדי לשמור על בהירות ממשק המשתמש ועל נוחות השימוש, חשוב לוודא שהפריסות והמשאבים מותאמים לשינויים האלה בצורה נכונה. כדאי להשתמש בפיקסלים בלתי תלויים בדחיסות (dp) עבור פריסות, לספק משאבים ספציפיים לדחיסות ולוודא שממשק המשתמש מותאם בצורה הולמת.
  • תמיכה נכונה בציוד היקפי חיצוני: כשמשתמשים מתחברים למסך חיצוני, הם לרוב יוצרים סביבה שדומה יותר לסביבת מחשב. לעתים קרובות זה כולל שימוש במקלדות חיצוניות, בעכברים, בלוחות מגע, במצלמות אינטרנט, במיקרופונים וברמקולים. שיפור התמיכה באינטראקציות עם מקלדת ועם עכבר.

בנייה לעתיד של המחשבים עם כלים מודרניים

אנחנו מספקים כמה כלים שיעזרו לכם ליצור את חוויית השימוש במחשב. בואו נסכם את העדכונים האחרונים בספריות הליבה האדפטיביות שלנו.

סיווגים חדשים של גודל החלון: גדול וגדול במיוחד

העדכון הכי גדול ב-Jetpack WindowManager 1.5.0 הוא הוספה של שני סוגים חדשים של חלונות לפי רוחב: Large ו-Extra-large.

סוגי החלונות הם קבוצה רשמית של נקודות עצירה של אזור התצוגה, שנועדה לעזור לכם לעצב ולפתח פריסות מותאמות. בגרסה 1.5.0, אנחנו מרחיבים את ההנחיות האלה למסכים שגדולים יותר מגודל הטאבלטים הרגיל.

אלה נקודות עצירה חדשות לרוחב:

  • גדול: לרוחב של 1,200dp עד 1,600dp
  • גדול במיוחד: לרוחבים של ‎≥1,600dp
windowClasses.png

הסיווגים השונים של גודל החלון על סמך רוחב המסך.

במסכים גדולים מאוד, הגדלה של פריסת התצוגה המורחבת של טאבלט לא תמיד מספקת את חוויית המשתמש הטובה ביותר. לדוגמה, תוכנת אימייל יכולה להציג בנוחות שני חלונות (תיבת דואר והודעה) בגודל חלון מורחב. אבל במסך מחשב בגודל גדול במיוחד, תוכנת האימייל יכולה להציג בצורה מסודרת שלוש או אפילו ארבע חלוניות, למשל תיבת דואר, רשימת הודעות, את התוכן המלא של ההודעה וחלונית של יומן או משימות, והכול בו-זמנית.

כדי לכלול את הסיווגים החדשים של גודל החלון בפרויקט, פשוט קוראים לפונקציה מהקבוצה WindowSizeClass.BREAKPOINTS_V2 במקום WindowSizeClass.BREAKPOINTS_V1:

val currentWindowMetrics =
    WindowMetricsCalculator.getOrCreate()
    .computeCurrentWindowMetrics(LocalContext.current)

val sizeClass = WindowSizeClass.BREAKPOINTS_V2
    .computeWindowSizeClass(currentWindowMetrics)

אחרי שמוודאים שיש לאפליקציה לפחות את המקום הזה, אפשר להחיל את הפריסה הנכונה:

if(sizeClass.isWidthAtLeastBreakpoint(
    WindowSizeClass.WIDTH_DP_LARGE_LOWER_BOUND)){
    ...
	// Window is at least 1200 dp wide.
}

פיתוח פריסות מותאמות באמצעות Jetpack Navigation 3

Navigation 3 הוא התוסף האחרון לאוסף Jetpack. ‫Navigation 3, שהגיע לאחרונה לגרסה היציבה הראשונה שלו, הוא ספריית ניווט עוצמתית שנועדה לעבוד עם Compose.

‫Navigation 3 הוא גם כלי מצוין ליצירת פריסות דינמיות, כי הוא מאפשר להציג כמה יעדים בו-זמנית ולעבור בצורה חלקה בין הפריסות האלה.

המערכת הזו לניהול זרימת ממשק המשתמש של האפליקציה מבוססת על Scenes. סצנה היא פריסה שמציגה יעד אחד או יותר בו-זמנית. ‫SceneStrategy קובע אם אפשר ליצור סצנה. שרשור של מופעים של SceneStrategy מאפשר ליצור ולהציג סצנות שונות לגדלים שונים של מסכים ולהגדרות שונות של מכשירים.

כדי להשתמש בפריסות קנוניות מוכנות, כמו רשימה עם פרטים וחלון תומך, אפשר להשתמש בסצנות מהספרייה של Compose Material 3 Adaptive (זמינה בגרסה 1.3 ומעלה).

אפשר גם ליצור בקלות סצנות מותאמות אישית משלכם על ידי שינוי של מתכוני הסצנות או על ידי יצירה מאפס. לדוגמה, נניח שיש סצנה שבה מוצגים שלושה חלונות זה לצד זה:

class ThreePaneScene<T : Any>(
    override val key: Any,
    override val previousEntries: List<NavEntry<T>>,
    val firstEntry: NavEntry<T>,
    val secondEntry: NavEntry<T>,
    val thirdEntry: NavEntry<T>
) : Scene<T> {
    override val entries: List<NavEntry<T>> = listOf(firstEntry, secondEntry, thirdEntry)
    override val content: @Composable (() -> Unit) = {
        Row(modifier = Modifier.fillMaxSize()) {
            Column(modifier = Modifier.weight(1f)) {
                firstEntry.Content()
            }
            Column(modifier = Modifier.weight(1f)) {
                secondEntry.Content()
            }
            Column(modifier = Modifier.weight(1f)) {
                thirdEntry.Content()
            }
        }
    }

בתרחיש הזה, אפשר להגדיר SceneStrategy כדי להציג שלושה חלונות אם רוחב החלון מספיק, והערכים מסטאק החזרה הצהירו שהם תומכים בהצגה בסצנה עם שלושה חלונות.

class ThreePaneSceneStrategy<T : Any>(val windowSizeClass: WindowSizeClass) : SceneStrategy<T> {
    override fun SceneStrategyScope<T>.calculateScene(entries: List<NavEntry<T>>): Scene<T>? {
        if (windowSizeClass.isWidthAtLeastBreakpoint(WIDTH_DP_LARGE_LOWER_BOUND)) {
            val lastThree = entries.takeLast(3)
            if (lastThree.size == 3 && lastThree.all { it.metadata.containsKey(MULTI_PANE_KEY) }) {
                val firstEntry = lastThree[0]
                val secondEntry = lastThree[1]
                val thirdEntry = lastThree[2]


                return ThreePaneScene(
                    key = Triple(firstEntry.contentKey, secondEntry.contentKey, thirdEntry.contentKey),
                    previousEntries = entries.dropLast(3),
                    firstEntry = firstEntry,
                    secondEntry = secondEntry,
                    thirdEntry = thirdEntry
                )
            }
        }
        return null
    }
}

אתם יכולים להשתמש ב-ThreePaneSceneStrategy עם שיטות אחרות כשאתם יוצרים NavDisplay. לדוגמה, אפשר גם להוסיף TwoPaneStrategy כדי להציג שני חלונות זה לצד זה כשאין מספיק מקום להצגת שלושה חלונות.

val strategy = ThreePaneSceneStrategy() then TwoPaneSceneStrategy()

NavDisplay(..., 
  sceneStrategy = strategy,
  entryProvider = entryProvider { 
    entry<MyScreen>(metadata = mapOf(MULTI_PANE_KEY to true))) { ... }
    ... other entries...
  }
)

אם אין מספיק מקום להצגת שלושה או שני חלונות – שתי אסטרטגיות הסצנות המותאמות אישית שלנו מחזירות null. במקרה כזה, NavDisplay חוזר להצגת הרשומה האחרונה במקבץ פעילויות קודמות (back stack) בחלונית אחת באמצעות SinglePaneScene

באמצעות סצנות ואסטרטגיות, אפשר להוסיף לאפליקציה פריסות עם חלונית אחת, שתי חלוניות ושלוש חלוניות.

adaptivepane.gif

אפליקציה אדפטיבית שמציגה ניווט בשלושה חלונות במסכים רחבים.

בתיעוד מוסבר איך ליצור פריסות בהתאמה אישית באמצעות סצנות בגרסה 3 של Navigation.

פריסות מותאמות שמוצגות באופן עצמאי

אם אתם צריכים פריסה עצמאית, ספריית Compose Material 3 Adaptive עוזרת לכם ליצור ממשקי משתמש רספונסיביים כמו פריסות של רשימה ופירוט ופריסות של חלונית תומכת, שמותאמות אוטומטית  להגדרות החלון על סמך  סיווגי גודל החלון או מצבי המכשיר. 

החדשות הטובות הן שהספרייה כבר מעודכנת עם נקודות ההפסקה החדשות. החל מגרסה 1.2, פונקציות ברירת המחדל של הנחיית הפיגום של החלונית תומכות בשיעורי גודל חלון ברוחב גדול וגדול במיוחד.

כדי להפעיל את התכונה, צריך להצהיר בקובץ ה-build של Gradle שרוצים להשתמש בנקודות העצירה החדשות:

currentWindowAdaptiveInfo(supportLargeAndXLargeWidth = true)

תחילת העבודה

כדאי להכיר את התכונה 'הצגה במכשיר המחובר' בגרסה האחרונה של Android. אפשר להוריד את Android 16 QPR3 למכשיר נתמך, ואז לחבר אותו לצג חיצוני כדי להתחיל לבדוק את האפליקציה כבר היום. 

כדי לקבל מידע נוסף על הטמעה של השיטות המומלצות האלה, אפשר לעיין במסמכי התיעוד המעודכנים בנושא תמיכה במספר מסכים וניהול חלונות.

משוב

המשוב שלכם חשוב לנו מאוד, כי אנחנו ממשיכים לשפר את חוויית השימוש בשולחן העבודה עם צג מחובר. נשמח לקבל ממך משוב ולדווח על בעיות באמצעות ערוצי המשוב הרשמיים שלנו.

אנחנו מחויבים להפוך את Android לפלטפורמה רב-תכליתית שמתאימה לדרכים הרבות שבהן משתמשים רוצים ליצור אינטראקציה עם האפליקציות והמכשירים שלהם. השיפורים בתמיכה בצגים מחוברים הם עוד צעד בכיוון הזה, ואנחנו חושבים שהמשתמשים שלכם יאהבו את חוויית השימוש במחשב שתבנו!


*הערה: בזמן כתיבת המאמר, יש תמיכה במסכים מחוברים בסדרות Pixel 8,‏ 9 ו-10, ובמגוון רחב של מכשירי סמסונג, כולל S26,‏ Fold7,‏ Flip7 ו-Tab S11.

נכתב על ידי:

להמשך הקריאה