תמיכה בנושא נגישות של תצוגה בהתאמה אישית ב-Android TV

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

יכול להיות שרכיבי תצוגה מותאמים אישית שמתקשרים ישירות עם OpenGL או Canvas לא יפעלו בצורה טובה עם שירותי נגישות כמו Talkback וגישה באמצעות מתג.

כדאי להביא בחשבון כמה בעיות שיכולות להתרחש כש-Talkback מופעל:

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

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

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

אירועים של כפתורי החיצים (D-pad) נצרכים על ידי שירותי נגישות

הסיבה הבסיסית לבעיה היא ששירותי נגישות צורכים אירועים מרכזיים.

שימוש באירועים של לחצני החיצים ו-TalkBack
איור 1. תרשימים שמציגים איך המערכת פועלת כש-TalkBack מופעל וכשהוא מושבת.

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

גם שירותי נגישות אחרים מושפעים באופן דומה: יכול להיות שאירועים של כפתורי החיצים (D-pad) ייצרכו גם כשמשתמשים בגישה באמצעות מתג.

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

חשיפת מידע לשירותי נגישות

כדי לספק שירותי נגישות עם מספיק מידע על המיקום והתיאור של תצוגות מותאמות אישית, צריך להטמיע את AccessibilityNodeInfo כדי לחשוף פרטים של כל רכיב. כדי להגדיר את הקשר הלוגי בין התצוגות כך ששירותי הנגישות יוכלו לנהל את המיקוד, צריך להטמיע את ExploreByTouchHelper ולהגדיר אותו באמצעות ViewCompat.setAccessibilityDelegate(View, AccessibilityDelegateCompat) לתצוגות בהתאמה אישית.

כשמטמיעים את ExploreByTouchHelper, צריך לבטל את ארבע השיטות המופשטות שלו:

Kotlin

// Return the virtual view ID whose view is covered by the input point (x, y).
protected fun getVirtualViewAt(x: Float, y: Float): Int

// Fill the virtual view ID list into the input parameter virtualViewIds.
protected fun getVisibleVirtualViews(virtualViewIds: List<Int>)

// For the view whose virtualViewId is the input virtualViewId, populate the
// accessibility node information into the AccessibilityNodeInfoCompat parameter.
protected fun onPopulateNodeForVirtualView(virtualViewId: Int, @NonNull node: AccessibilityNodeInfoCompat)

// Set the accessibility handling when perform action.
protected fun onPerformActionForVirtualView(virtualViewId: Int, action: Int, @Nullable arguments: Bundle): Boolean

Java

// Return the virtual view ID whose view is covered by the input point (x, y).
protected int getVirtualViewAt(float x, float y)

// Fill the virtual view ID list into the input parameter virtualViewIds.
protected void getVisibleVirtualViews(List<Integer> virtualViewIds)

// For the view whose virtualViewId is the input virtualViewId, populate the
// accessibility node information into the AccessibilityNodeInfoCompat parameter.
protected void onPopulateNodeForVirtualView(int virtualViewId, @NonNull AccessibilityNodeInfoCompat node)

// Set the accessibility handling when perform action.
protected boolean onPerformActionForVirtualView(int virtualViewId, int action, @Nullable Bundle arguments)

לפרטים נוספים, אפשר לצפות בסרטון Google I/O 2013 - Enabling Blind and Low-Vision Accessibility on Android או לקרוא מידע נוסף על מילוי אירועי נגישות.

שיטות מומלצות

דוגמה

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