במכשירי טלוויזיה נדרש מכשיר חומרה משני כדי לקיים אינטראקציה עם אפליקציות – שלט רחוק בסיסי, שלט רחוק עם מצביע או שלט משחק. כדי לספק חוויית משתמש עקבית, האפליקציה צריכה לתמוך בקלט של כפתורי החיצים (D-pad), לטפל בבקרים שמתנתקים ולתמוך בקלט מכמה סוגי בקרים, כולל שלטים רחוקים עם מצביע.
כפתורי החיצים (D-pad) – אמצעי בקרה מינימליים
אמצעי הבקרה שמוגדר כברירת מחדל במכשיר טלוויזיה הוא כפתורי החיצים (D-pad). באופן כללי, צריך להיות אפשר להפעיל את האפליקציה באמצעות שלט רחוק שיש בו רק את הכפתורים הבאים: למעלה, למטה, שמאלה, ימינה, בחירה, חזרה ודף הבית. אם האפליקציה היא משחק שבדרך כלל נדרש עבורו שלט משחק עם פקדים נוספים, כדאי לנסות לתמוך בגיימפליי רק באמצעות כפתורי החיצים (D-pad) האלה. אחרת, צריך להזהיר את המשתמשים שנדרש בקר ולאפשר להם לצאת מהמשחק בצורה חלקה באמצעות כפתורי החיצים (D-pad).
מידע נוסף על ניווט באמצעות כפתורי החיצים (D-pad) במכשירי טלוויזיה זמין במאמר ניווט בטלוויזיה.
טיפול בניתוקים של הבקר
בקרים לטלוויזיה הם בדרך כלל מכשירי Bluetooth, שעשויים לנסות לחסוך בחשמל על ידי מעבר למצב שינה מדי פעם והתנתקות ממכשיר הטלוויזיה. כלומר, יכול להיות שהאפליקציה תופסק או תופעל מחדש אם היא לא מוגדרת לטפל באירועי החיבור מחדש האלה. האירועים האלה יכולים להתרחש בכל אחד מהמקרים הבאים:
- בזמן שסרטון באורך של כמה דקות פועל, כפתורי החיצים (D-pad) או שלט המשחק עשויים להיכנס למצב שינה, להתנתק מהטלוויזיה ולהתחבר מחדש מאוחר יותר.
- במהלך המשחק, שחקן חדש יכול להצטרף למשחק באמצעות שלט משחק שלא מחובר עדיין.
- במהלך המשחק, שחקן יכול לצאת מהמשחק ולנתק את שלט המשחק.
כל פעילות באפליקציית הטלוויזיה שכוללת אירועי ניתוק וחיבור מחדש צריכה להיות מוגדרת לטיפול באירועי חיבור מחדש בקובץ המניפסט של האפליקציה. דוגמת הקוד הבאה מראה איך להפעיל פעילות כדי לטפל בשינויים בהגדרות האישיות, כולל חיבור, ניתוק או חיבור מחדש של מקלדת או מכשיר ניווט:
<activity
android:name="com.example.android.TvActivity"
android:label="@string/app_name"
android:configChanges="keyboard|keyboardHidden|navigation"
android:theme="@style/Theme.Leanback">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LEANBACK_LAUNCHER" />
</intent-filter>
...
</activity>
השינוי הזה בהגדרה מאפשר לאפליקציה להמשיך לפעול במהלך אירוע של חיבור מחדש, במקום שהיא תופעל מחדש על ידי Android Framework, מה שפוגע בחוויית המשתמש.
איך לטפל בווריאציות של קלט מכפתורי החיצים (D-pad)
יכול להיות שלמשתמשים במכשירי טלוויזיה יש יותר מסוג אחד של בקר שהם משתמשים בו עם הטלוויזיה. לדוגמה, למשתמש יכול להיות שלט בסיסי עם כפתורי חיצים, שלט עם סמן או שלט משחק. קודי המקשים ששלט משחק מספק כשהוא משמש לפונקציות של כפתורי החיצים (D-pad) עשויים להיות שונים מקודי המקשים שנשלחים על ידי כפתורי חיצים בסיסיים.
כדי שהמשתמש לא יצטרך להחליף בקרים כדי להפעיל את האפליקציה, צריך לטפל בווריאציות בקלט של כפתורי החיצים. מידע נוסף על טיפול בווריאציות בקלט זמין במאמר עיבוד קלט של כפתורי החיצים.
תמיכה בשלטים עם סמן
חלק ממכשירי הטלוויזיה תומכים בשלטים עם סמן, כמו עכבר אוויר או שלטים עם משטחי כיוון רגישים למגע (משטחי מגע). תמיכה בשלטים עם מצביע מאפשרת למשתמשים לבצע אינטראקציה עם האפליקציה באמצעות תנועות הצבעה ולחיצה, העברת העכבר, החלקה וגרירה. כך הם נהנים מחוויה חלקה יותר בחומרה תואמת, תוך שמירה על תאימות מלאה לכפתורי החיצים (D-pad).
הצהרה על תמיכה מרחוק במצביע בקובץ המניפסט
כדי לציין שאפשר לנווט באפליקציה באמצעות סמן וקלט מגע, צריך להגדיר את קובץ המניפסט של האפליקציה כך ש-android.software.leanback.supports_touch
<property> מוגדר כ-true בתוך הרכיב <application> (או בתוך רכיבי <activity> נפרדים כדי להגדיר תמיכה לכל פעילות):
<manifest ...>
<!-- Signal whether the app is adaptive or built just for TV -->
<uses-feature
android:name="android.software.leanback"
android:required="true|false" />
<!-- Ensure the app can be installed on conventional TVs -->
<uses-feature
android:name="android.hardware.touchscreen"
android:required="false" />
<application ...>
<!-- Signal whether the app supports pointer remotes -->
<property
android:name="android.software.leanback.supports_touch"
android:value="true" />
...
</application>
</manifest>
תמיכה באינטראקציות של קליק, העברת העכבר מעל פריט וגלילה
כשמוסיפים תמיכה בשלטים עם מצביע, חשוב לוודא שרכיבי ממשק המשתמש מגיבים בצורה מתאימה לקלט של הסמן והמגע באינטראקציות הבאות:
- לחיצה ובחירה: כל הרכיבים בממשק המשתמש שאפשר להתמקד בהם ולבחור אותם צריכים להיות ניתנים ללחיצה באמצעות השלט הרחוק עם הסמן, בהתאם להתנהגות של בחירה באמצעות כפתורי החיצים (
KEYCODE_DPAD_CENTER).- Jetpack Compose: משתמשים במשני הערכים
Modifier.clickable()אוpointerInput. מידע נוסף זמין בקטע נגיעה ולחיצה. - תצוגות: טיפול באירועים מסוג קליק בתצוגות. לפרטים נוספים, קראו את הסקירה הכללית של אירועי קלט.
- Jetpack Compose: משתמשים במשני הערכים
- מצבי ריחוף חזותיים: מספקים אפקט ריחוף חזותי ברור כדי לציין מתי סמן העכבר ממוקם מעל פריט שניתן לבחור.
- Jetpack Compose: משתמשים ב-
Modifier.hoverable()או צופים במצבי העברת העכבר באמצעותInteractionSource. למידע נוסף, ראו טיפול באינטראקציות של משתמשים. - תצוגות: מגדירים מצבי העברה באמצעות רשימת מצבים של רכיבים שניתן לשרטט עם
android:state_hovered="true".
- Jetpack Compose: משתמשים ב-
- גלילה בהחלקה ובזריקה: גלילה אופקית ואנכית שמופעלת באמצעות תנועת החלקה או זריקה בכפתור החיצים (D-pad) המרכזי שרגיש למגע, צריכה לפעול בצורה חלקה בכל התוכן שניתן לגלול בו.
- גלילה בגרירה: המשתמשים צריכים להיות מסוגלים לגרור כדי לגלול אנכית (למעלה ולמטה) או אופקית (שמאלה וימינה) בתוך קונטיינרים שאפשר לגלול בהם.
- Jetpack פיתוח נייטיב: מאגרים רגילים עם אפשרות גלילה תומכים בגלילה באמצעות מצביע ובגלילה במגע כברירת מחדל. להטמעות בהתאמה אישית, ראו קלט של סמן ב-Compose.
- תצוגות: תצוגות רגילות שניתן לגלול בהן תומכות בגלילה באמצעות מגע כברירת מחדל. כדי לטפל בקלט בהתאמה אישית, אפשר לעיין במאמר מגע וקלט.
- גרירה של סרגל הדילוג: במהלך הפעלת מדיה (כמו תוכניות טלוויזיה וסרטים), המשתמשים צריכים להיות מסוגלים לבצע אינטראקציה עם סרגל ההתקדמות של ההפעלה (סרגל הדילוג) על ידי הצבעה ולחיצה כדי לדלג לחותמת זמן קודמת או עתידית, וגם לגרור את סרגל ההתקדמות כדי לדלג לזמן ספציפי.
טיפול באירועי לחיצה על כפתורים
כשהמשתמש לוחץ על כפתור בשלט, האפליקציה מקבלת אירוע עם KeyEvent. ההתנהגות המיועדת של הלחצן יכולה להיות אירוע מדיה, כמו הפעלה, השהיה או עצירה, או אירוע מסוג טלוויזיה, כמו בחירה או ניווט. כדי לספק חוויית משתמש טובה, הקצו התנהגות עקבית ללחצני הבקר.
אירועים בממשק המשתמש של הטלוויזיה
מקצים התנהגות של ממשק משתמש בטלוויזיה לכפתורים שיוצרים סוגים של KeyEvent, כפי שמוצג בטבלה הבאה:
KeyEvent |
התנהגות |
|---|---|
KEYCODE_BUTTON_B, KEYCODE_BACK |
חזרה |
KEYCODE_BUTTON_SELECT, KEYCODE_BUTTON_A, KEYCODE_ENTER, KEYCODE_DPAD_CENTER, KEYCODE_NUMPAD_ENTER |
בחירה |
KEYCODE_DPAD_UP, KEYCODE_DPAD_DOWN, KEYCODE_DPAD_LEFT, KEYCODE_DPAD_RIGHT |
ניווט |
אירועי מדיה
כשהמשתמש צופה במדיה, צריך להקצות התנהגות ללחצנים שיוצרים סוגים של KeyEvent, כפי שמוצג בטבלה הבאה. אם האפליקציה שלכם שולטת ב-MediaSession, אתם צריכים להשתמש ב-MediaControllerAdapter כדי להפעיל את אחת מהשיטות של MediaControllerCompat.TransportControls שמוצגות בטבלה. שימו לב שכפתורי הבחירה פועלים ככפתורי הפעלה או השהיה בהקשר הזה.
KeyEvent |
שיחת TransportControls | התנהגות |
|---|---|---|
BUTTON_SELECT, BUTTON_A, ENTER, DPAD_CENTER, KEYCODE_NUMPAD_ENTER |
play() |
הפעלה |
BUTTON_START, BUTTON_SELECT, BUTTON_A, ENTER, DPAD_CENTER, KEYCODE_NUMPAD_ENTER |
pause() |
השהיה |
BUTTON_R1 |
skipToNext() |
דילוג לפריט המדיה הבא |
BUTTON_L1 |
skipToPrevious() |
דילוג לפריט המדיה הקודם |
DPAD_RIGHT, BUTTON_R2, AXIS_RTRIGGER, AXIS_THROTTLE |
fastForward() |
הרצה קדימה |
DPAD_LEFT, BUTTON_L2, AXIS_LTRIGGER, AXIS_BRAKE |
rewind() |
הרצה אחורה |
| לא רלוונטי | stop() |
עצירה |
התנהגות מתאימה של הכפתור "הקודם"
הכפתור "הקודם" אף פעם לא צריך לפעול כמתג. לדוגמה, אל תשתמשו בו גם כדי לפתוח וגם כדי לסגור תפריט. השתמשו בו רק כדי לנווט אחורה, בסגנון פירורי לחם, דרך המסכים הקודמים שהשחקן היה בהם.
הכפתור "הקודם" מאפשר רק ניווט ליניארי אחורה, ולכן אפשר להשתמש בו כדי לצאת מתפריט בתוך האפליקציה שנפתח באמצעות כפתור אחר ולחזור לאפליקציה. לחיצה רצופה על הכפתור "הקודם" תמיד צריכה להוביל בסופו של דבר למסך הבית של Android TV. לדוגמה: משחק > מסך השהיית המשחק > המסך הראשי של המשחק > מסך הבית של Android TV או הפעלת תוכנית טלוויזיה > המסך הראשי של אפליקציית הטלוויזיה
מסך הבית של Android TV.
מידע נוסף על עיצוב הניווט זמין במאמר עיצוב הניווט "הקודם" ו"למעלה". כדי ללמוד על ההטמעה, אפשר לעיין במאמר מתן ניווט תקין לאחור.
שלטים למשחקים
כשמפתחים משחקים ל-Android TV, חשוב לתכנן את סכמת הבקרה כך שתפעל גם עם שלטי טלוויזיה רגילים וגם עם שלטי משחק ייעודיים.
תמיכה בכפתורי החיצים (D-pad)
כדאי לתכנן את מערך הבקרה סביב כפתורי החיצים (D-pad), כי מערך הבקרה הזה הוא ברירת המחדל במכשירי Android TV. השחקנים צריכים להיות מסוגלים להשתמש בכפתורי החיצים (D-pad) בכל ההיבטים של המשחק – לא רק כדי לשלוט בגיימפליי, אלא גם כדי לנווט בתפריטים ובמודעות. לכן, חשוב לוודא שהמשחק ל-Android TV לא מתייחס לממשק מגע עם ניסוח כמו "לחצו כאן כדי להמשיך".
האופן שבו אתם מעצבים את האינטראקציה של השחקן עם השלט יכול להיות המפתח לחוויית משתמש מעולה. כדאי להביא בחשבון את השיטות המומלצות הבאות:
- הבהירו מראש את הדרישות לגבי בקרים: השתמשו בתיאור ב-Google Play כדי להבהיר לשחקנים מהן הציפיות לגבי בקרים. אם המשחק מתאים יותר לשלט עם ג'ויסטיק מאשר לשלט עם כפתורי חיצים (D-pad) בלבד, חשוב לציין את זה. שחקן שמשתמש בשלט שלא מתאים למשחק עלול לחוות חוויה לא טובה ולתת למשחק דירוג נמוך.
- השתמשו במיפוי לחצנים עקבי: מיפוי לחצנים אינטואיטיבי הוא המפתח לחוויית משתמש טובה. לדוגמה, כדאי לפעול לפי המוסכמות המקובלות ולהשתמש בלחצן A כדי לאשר ובכפתור B כדי לבטל. כדי להציע גמישות, אתם יכולים לאפשר למשתמשים למפות מחדש את הלחצנים. מידע נוסף על מיפוי לחצנים זמין במאמר טיפול בפעולות של בקר.
- זיהוי היכולות של השלט והתאמה בהתאם: שולחים שאילתה לשלט לגבי היכולות שלו כדי לשפר את ההתאמה בין השלט למשחק. לדוגמה, יכול להיות שאתם רוצים שהשחקן ינווט אובייקט על ידי הנפת הבקר באוויר, אבל אם לבקר של השחקן אין חומרת מד תאוצה וגירוסקופ, ההנפה לא תעבוד. שולחים שאילתה לבקר, ואם אין תמיכה בזיהוי תנועה, עוברים לסכמת בקרה חלופית זמינה. מידע נוסף על שאילתות לגבי יכולות של בקרים זמין במאמר תמיכה בבקרים בגרסאות שונות של Android.
שימוש בכפתורים המתאימים
לא בכל שלטי המשחק יש כפתורי "התחלה", "חיפוש" או "תפריט". חשוב לוודא שממשק המשתמש לא תלוי בשימוש בלחצנים האלה.
טיפול בכמה שלטי משחק
כשכמה שחקנים משחקים במשחק, ולכל אחד מהם יש שלט משלו, חשוב למפות כל זוג של שחקן ושלט. במאמר getControllerNumber() מוסבר איך מטמיעים זיהוי של מספר בקר.
טיפול בניתוקים של הבקר
אם שלט מתנתק באמצע המשחק, צריך להשהות את המשחק ולהציג תיבת דו-שיח שבה השחקן שהשלט שלו התנתק מתבקש לחבר אותו מחדש.
בנוסף, כדאי להציע טיפים לפתרון בעיות בתיבת הדו-שיח. לדוגמה, אפשר להגיד לשחקן: "תבדוק את חיבור ה-Bluetooth". מידע נוסף על הטמעת תמיכה במכשירים לקליטת נתונים זמין במאמרים טיפול בפעולות של בקר וסקירה כללית של Bluetooth.
הצגת ההוראות של הבקר
אם המשחק כולל הוראות חזותיות לשליטה במשחק, צריך להשתמש בתמונה של בקר ללא מיתוג ולכלול רק לחצנים שתואמים ל-Android.
כדי לראות תמונות לדוגמה של בקר שתואם ל-Android, הורידו את התבנית של בקר המשחק ל-Android TV (קובץ ZIP). הוא כולל שלט לבן על רקע שחור ושלט שחור על רקע לבן (כמו שמוצג באיור 1) כקובץ PNG וכקובץ Adobe® Illustrator®.