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

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

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

אנחנו שמחים להודיע על אבן דרך משמעותית בקירוב בין מחשוב נייד למחשוב שולחני ב-Android: תמיכה במסכים מחוברים זמינה לכלל המשתמשים (GA) עם ההשקה של 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

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

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

כדי לכלול את הסיווגים החדשים של גודל החלון בפרויקט, פשוט קוראים לפונקציה מהקבוצה 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, פונקציות ברירת המחדל של הנחיית ה-scaffold של החלונית תומכות בשיעורי גודל של חלונות ברוחב גדול וגדול במיוחד.

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

currentWindowAdaptiveInfo(supportLargeAndXLargeWidth = true)

תחילת העבודה

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

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

משוב

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

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


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

נכתב על ידי:
להמשך קריאה