חיתוך תצוגה הוא אזור במכשירים מסוימים שמתרחב אל פני השטח של התצוגה. הוא מאפשר חוויה מקצה לקצה, תוך מתן מקום לחיישנים חשובים בחלק הקדמי של המכשיר.
Android תומך בחיתוכי מסך במכשירים עם Android מגרסה 9 (רמת API 28) ומעלה. עם זאת, יצרני מכשירים יכולים גם לתמוך בחלקים חסרים במסך במכשירים עם Android מגרסה 8.1 ומטה.
במסמך הזה מוסבר איך להטמיע תמיכה במכשירים עם חריצים, כולל איך לעבוד עם אזור החריץ – כלומר, המלבן מקצה לקצה על משטח התצוגה שמכיל את החריץ.
בחירת האופן שבו האפליקציה מטפלת באזורים חתוכים
אם לא רוצים שהתוכן יחפוף לאזור החיתוך, בדרך כלל מספיק לוודא שהתוכן לא חופף לסרגל הסטטוס ולסרגל הניווט. אם אתם מבצעים רינדור באזור החיתוך, אתם יכולים להשתמש ב-WindowInsetsCompat.getDisplayCutout() כדי לאחזר אובייקט DisplayCutout שמכיל את השוליים הבטוחים ואת תיבת התוחמת של כל חיתוך. ממשקי ה-API האלה מאפשרים לכם לבדוק אם התוכן שלכם חופף לאזור החתוך, כדי שתוכלו לשנות את המיקום שלו אם צריך.
אפשר גם לקבוע אם התוכן יוצג מאחורי אזור החיתוך. מאפיין פריסת החלון layoutInDisplayCutoutMode קובע איך התוכן יוצג באזור החיתוך.
אפשר להגדיר את layoutInDisplayCutoutMode לאחד מהערכים הבאים:
-
LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT: התוכן מוצג באזור המגרעת כשהמגרעת במסך כלולה בסרגל המערכת. אחרת, החלון לא חופף למגרעת במסך. לדוגמה, יכול להיות שתוכן יוצג בפורמט letterbox כשמציגים אותו בפריסה לרוחב. אם האפליקציה מטרגטת ל-SDK 35, הערך הזה מתפרש כ-ALWAYSלחלונות לא צפים. -
LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS: התוכן תמיד יכול להתרחב לאזורים של החלק החסר. אם האפליקציה מטרגטת ל-SDK 35 והיא פועלת במכשיר עם Android 15, זהו המצב היחיד שבו מותר להשתמש בחלונות לא צפים כדי להבטיח תצוגה מקצה לקצה. -
LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES: התוכן מוצג באזור החיתוך גם במצב לאורך וגם במצב לרוחב. לא להשתמש באפשרות הזו לחלונות צפים. אם האפליקציה מטרגטת ל-SDK 35, הערך הזה מתפרש כ-ALWAYSלחלונות לא צפים. -
LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER: התוכן אף פעם לא מוצג באזור החיתוך. אם האפליקציה מטרגטת SDK 35, הערך הזה מתפרש כ-ALWAYSעבור חלונות לא צפים.
אפשר להגדיר את מצב החיתוך באופן פרוגרמטי או על ידי הגדרת סגנון בפעילות. בדוגמה הבאה מוגדר סגנון להחלת המאפיין LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES על הפעילות.
<style name="ActivityTheme"> <item name="android:windowLayoutInDisplayCutoutMode"> shortEdges <!-- default, shortEdges, or never --> </item> </style>
בקטעים הבאים מתוארים מצבי החיתוך השונים בפירוט רב יותר.
התנהגות ברירת מחדל
אם האפליקציה מטרגטת ל-SDK 35 והיא פועלת במכשיר Android 15, התנהגות ברירת המחדל היא LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS, ו-LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT מתפרש כ-LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS עבור חלונות לא צפים.
אחרת, LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT היא ברירת המחדל.
עיבוד תוכן באזורי המגרעת בצד הקצר
אם האפליקציה מטרגטת ל-SDK 35 והיא פועלת במכשיר עם Android 15,
LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES יפורש כ-
LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS עבור חלונות לא צפים.
במצב LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES, התוכן מתרחב לאזור החיתוך בקצה הקצר של המסך, גם בכיוון תצוגה לאורך וגם בכיוון תצוגה לרוחב, בלי קשר לשאלה אם סרגלי המערכת מוסתרים או גלויים. כשמשתמשים במצב הזה, חשוב לוודא שאין תוכן חשוב שחופף לאזור החיתוך.
בתמונה הבאה מוצגת דוגמה לLAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
במכשיר במצב אנכי:
בתמונה הבאה מוצגת דוגמה ל-LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
במכשיר במצב לרוחב:
במצב הזה, החלון מתרחב מתחת לחלקים החסרים בקצה הקצר של המסך, גם במצב לאורך וגם במצב לרוחב, בלי קשר לשאלה אם החלון מסתיר את סרגלי המערכת.
חיתוך בפינה נחשב לחיתוך בצד הקצר:
לעולם לא להציג תוכן באזור המגרעת במסך
אם האפליקציה מטרגטת ל-SDK 35 והיא פועלת במכשיר עם Android 15,
LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER יפורש כ-
LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS עבור חלונות לא צפים.
עם LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER, החלון אף פעם לא יכול לחפוף לאזור החיתוך.
דוגמה ל-LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER במצב אנכי:
LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER להדגשת דיוקן.
דוגמה ל-LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER בפריסה לרוחב:
LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER בפריסה לרוחב.
שיטות מומלצות לתמיכה במגרעת במסך
כשעובדים עם חיתוכי מסך, חשוב לזכור את הדברים הבאים:
- חשוב לשים לב למיקום של רכיבים חשובים בממשק המשתמש. חשוב לוודא שאזור החיתוך לא מסתיר טקסט חשוב, אמצעי בקרה או מידע אחר.
- אל תציבו או תרחיבו אלמנטים אינטראקטיביים שנדרשת בהם זיהוי של מגע מדויק באזור החיתוך. יכול להיות שרגישות המגע תהיה נמוכה יותר באזור החיתוך.
במקרים שבהם אפשר, משתמשים ב-
WindowInsetsCompatכדי לאחזר את הגובה של סרגל הסטטוס ולקבוע את הריווח המתאים שצריך להחיל על התוכן. לא כדאי לקודד קשיח את הגובה של סרגל הסטטוס, כי זה עלול לגרום לחפיפה או לקיטוע של התוכן.
איור 7. כדי למנוע חפיפה או חיתוך של התוכן, אפשר להשתמש בלחצן WindowInsetsCompat.אפשר להשתמש ב-
View.getLocationInWindow()כדי לראות כמה מקום בחלון האפליקציה תופסת. אל תניחו שהאפליקציה משתמשת בכל החלון, ואל תשתמשו ב-View.getLocationOnScreen().אם האפליקציה צריכה לעבור למצב סביבה היקפית ולצאת ממנו, צריך להשתמש במצבי החיתוך
always,shortEdgesאוnever. התנהגות ברירת המחדל של החלק החתוך יכולה לגרום לתוכן באפליקציה להיות מוצג באזור החלק החתוך בזמן שסרגלי המערכת מוצגים, אבל לא בזמן שהמכשיר במצב מסך מלא. כתוצאה מכך, התוכן זז למעלה ולמטה במהלך המעברים, כפי שמוצג בדוגמה הבאה.
איור 8. דוגמה לתוכן שזז למעלה ולמטה במהלך מעברים. במצב immersive, צריך להיזהר כשמשתמשים בקואורדינטות של חלון לעומת קואורדינטות של מסך, כי האפליקציה לא משתמשת בכל המסך כשמוצג פורמט letterbox. בגלל הפס השחור, קואורדינטות שמקורן במסך לא זהות לקואורדינטות שמקורן בחלון. אפשר להשתמש ב-
getLocationOnScreen()כדי להמיר קואורדינטות מסך לקואורדינטות של התצוגה לפי הצורך. התמונה הבאה מראה כיצד קואורדינטות שונות כאשר התוכן בפורמט letterbox:
איור 9. קואורדינטות של חלון לעומת קואורדינטות של מסך כשהתוכן מוצג עם פסים שחורים. כשמטפלים ב-
MotionEvent, כדאי להשתמש ב-MotionEvent.getX()וב-MotionEvent.getY()כדי למנוע בעיות דומות בקואורדינטות. אין להשתמש ב-MotionEvent.getRawX()או ב-MotionEvent.getRawY().
בדיקה של אופן העיבוד של התוכן
בודקים את כל המסכים וחוויות המשתמש באפליקציה. אם אפשר, כדאי לבדוק במכשירים עם סוגים שונים של חורים במסך. אם אין לכם מכשיר עם חור למצלמה, אתם יכולים לדמות תצורות נפוצות של חורים למצלמה בכל מכשיר או אמולטור עם Android 9 ומעלה. כדי לעשות זאת:
- מפעילים את האפשרות אפשרויות למפתחים.
- במסך אפשרויות למפתחים, גוללים למטה לקטע ציור ובוחרים באפשרות הדמיית תצוגה עם מגרעת.
בוחרים את סוג החיתוך.
איור 10. אפשרויות למפתחים לבדיקה של אופן העיבוד של התוכן.
מקורות מידע נוספים
- LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
- LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER
- LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
- LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT