ניהול החלונות

ב-ChromeOS יש תמיכה באפליקציות ל-Android בכמה חלונות. המערכת מעבדת אפליקציות למכלים של חלונות שהגודל שלהם נקבע לפי גורם הצורה במכשיר, כפי שמוצג באיור 1.

איור 1. חלון של אפליקציה במכשירים שונים.

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

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

גודל השקה ראשונית

אפליקציות יכולות לבקש את גודל ההשקה הראשוני שלהן בדרכים הבאות:

  • כדאי להשתמש בגודל הפעלה רק בסביבות של מחשבים. כך מנהל החלונות יכול לתת לכם גבולות מתאימים לכיוון מסוים. כדי לציין העדפות כשמשתמשים במצב מחשב, צריך להוסיף המטא תגים הבאים בתוך <activity>:
<meta-data android:name="WindowManagerPreference:FreeformWindowSize"
           android:value="[phone|tablet|maximize]" />
<meta-data android:name="WindowManagerPreference:FreeformWindowOrientation"
           android:value="[portrait|landscape]" />
  • השתמשו בגבולות הפעלה סטטיים. יש להשתמש ב-<layout> ברשומת המניפסט של פעילות כדי לציין 'קבוע' גודל התחלתי, כמו בדוגמה הבאה:
<layout android:defaultHeight="500dp"
            android:defaultWidth="600dp"
            android:gravity="top|end"
            android:minHeight="450dp"
            android:minWidth="300dp" />
  • שימוש בגבולות השקה דינמיים. פעילות יכולה ליצור ולהשתמש ActivityOptions.setLaunchBounds(Rect) בעת יצירת פעילות חדשה. על ידי שמציין מלבן ריק, אפשר להגדיל את האפליקציה.

שינוי הגודל של חלונות

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

איור 2. חלון אפליקציה שניתן לשנות את הגודל שלו.

יש שתי אפשרויות לשינוי גודל החלון כשמשתמשים כיתה אחת (View):

  • להגיב באופן דינמי לשינויים בהגדרות באמצעות קריאה onConfigurationChanged(..) לדוגמה, אפשר להוסיף android:configChanges="screenSize|smallestScreenSize|orientation|screenLayout" למניפסט של הפעילות. למידע נוסף על טיפול בשינויים של הגדרות אישיות, אפשר לקרוא טיפול בשינויים בהגדרות אישיות.
  • מאפשרים למערכת להפעיל מחדש את הפעילות. במקרה הזה, מטמיעים onSaveInstanceState ולהשתמש בארכיטקטורת ViewModel כדי לשחזר את מצב שמור.

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

מידות החלון

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

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

לתשומת ליבכם: גודל החלון וגודל המסך אינם זהים. כדי לקבל את גודל החלון ב-DP, יש להשתמש ב-Activity.getResources().getConfiguration().screenWidth ו-Activity.getResources().getConfiguration().screenHeight. סביר להניח לא תצטרכו אף פעם להשתמש בגודל המסך.

גבולות התוכן

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

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

    • NativeActivity.mLastContent[X/Y/Width/Height]()
    • findViewById(android.R.id.content).get[Width/Height]()

    אפשר לבצע מעקב רציף בעזרת צופה:

    • NativeActivity.onContentRectChangedNative()
    • NativeActivity.onGlobalLayout()
    • הוספת מאזינים ל-view.addOnLayoutChangeListener(findViewById(android.R.id.content))

    אם האפליקציה מבצעת התאמה לעומס (pre-scaling) של הגרפיקה, יש לעשות זאת בכל פעם שהרזולוציה משתנה.

שינוי גודל בסגנון חופשי

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

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

מצב מסך מלא

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

כיוון המסך

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

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

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

הפעילות והכיוון של הרמה הבסיסית (root)

חלון Chromebook מורכב ממקבץ של חלונות פעילות. כל חלון במקבץ יש את אותו הגודל והכיוון.

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

למצב המכשיר יש השפעה כאן: במצב טאבלט, הכיוון לא נעול, כל חלון שומר על הכיוון שלו, כרגיל ב-Android.

הנחיות כיוון

יש לפעול לפי ההנחיות הבאות בנוגע לכיוון:

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

שיקולים אחרים

יש עוד כמה דברים שכדאי להביא בחשבון כשעובדים עם אפליקציות ל-Android ב: ChromeOS:

  • אין להפעיל finish() בשיטת onDestroy של הפעילות. כתוצאה מכך שהאפליקציה תיסגר כשגודלה משתנה ולא תופעל מחדש.
  • אין להשתמש בסוגי חלונות שלא תואמים, כמו TYPE_KEYGUARD ו- TYPE_APPLICATION_MEDIA.
  • כדי שהפעילות תתחיל מחדש במהירות, אפשר לשמור במטמון אובייקטים שנשמרו שהוקצו להם.
  • אם אתם לא רוצים שהמשתמש ישנה את גודל האפליקציה, צריך לציין android:resizeableActivity=false בקובץ המניפסט.
  • צריך לבדוק את האפליקציה כדי לוודא שהיא מטפלת בשינויים ב גודל החלון המתאים.