I’m currently working on a mini-game app whose primary audience is people with visual impairments.
I’ve reviewed the available posts about the official accessibility module, as well as the LetterSpell GitHub project, which I’ve used as a basis to solve most of the issues I’ve encountered.
Even so, there are certain cases I haven’t been able to address for the design requirements I’ve been given.
Below is a list of problems, cases, and solutions I’ve come across.
Problem 1: Masking
Case 1.1: In the main menu, there are two main sections: the top bar where navigation is located and the bottom section. In the bottom section, there’s a scrollable list of games. The problem is that even when a button is completely covered by a mask, it can still be selected when TalkBack is enabled, even over the navigation buttons.
Here is a representation of how the Talkback would behave. Even pushing the tabs buttons selects the ones under it
Failed Solution 1.1.1:
I tried adding canvas elements and graphic raycasters to force a layer order change. I also tried adding an image as a blocker, but it seems the screen reader hierarchy is independent.
Semi-Failed Solution 1.1.2:
By changing the order of the hierarchy (placing the navigation bar lower), the AccessibleElements within it were prioritized. However, this creates a new problem: the screen reader detects the navigation bar as the last elements on the screen, which could cause confusion.
Case 1.2: In the mini-games, a pop-up appears before starting to allow the player to prepare. The pause button is located in a corner and can still be accessed using TalkBack.
Solution 1.2.1:
Deactivate all GameObjects that might interfere. This isn’t the optimal solution I’d prefer, but at least it works. In these types of cases, having an element similar to a Canvas Group where all child AccessibleElements can be deactivated would be very helpful.
Problem 2: AccessibleNode Elements and Reading Order
Case 2.1:
I’d like to add more variables to an AccessibleElement and control which are read and in what order. For example, if there’s a list of buttons, selecting one should read:
“Level 1, button, item 1 of 12, double-tap to interact.”
A more advanced case that’s been requested is to read the parent element the first time. For instance:
- If the focus is on navigation and shifts to a level button, it would read:
“Level selection, level 1, button [etc.].” - However, if navigation moves to a sibling, it would skip the parent and read:
“Level 2, button [etc.].”
Solution 2:
I haven’t found a starting point for this. The best I’ve managed is creating a custom element that replaces certain parts of the label with variables.
Case 2.2: In the options menu, toggles currently read their active state before reading the label.
Current result: “Activated, music, toggle.”
Expected result: “Music, toggle, activated.”
Right now, there’s very little documentation on this topic, so I’m quite lost. I’m also referencing apps like WhatsApp to see how I can make the design as standardized as possible.
In apps with accessibility features, I’ve noticed some important small details missing from the accessibility package (or at least I haven’t been able to find them):
- While scrolling, subtle clicks become sharper as you approach the end of the scroll.
- Switching between sections (e.g., navbar to main content) plays a “boop” sound.
- When opening a pop-up element (like a three-dot menu), the rest of the elements become inaccessible until the pop-up is closed.