Цель состоит в том, чтобы получить представления, с которыми можно взаимодействовать мгновенно (которые можно щелкнуть прямо сейчас, и что-то произойдет). Если представление видимо и кликабельно в целом, но на него наведено другое представление/меню/боковая панель, его следует опустить.
Голосовой доступ сделайте это. И, кажется, использует API доступности.
Прекрасным примером является нижнее меню в Google Maps. Когда он разворачивается, кнопка "Поиск по маршруту" внизу по-прежнему видна, но не подсвечивается приложением.
Итак, что мы имеем?
- Существует поток AccessibilityEvent. Наиболее полезным является AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED, поэтому мы можем получать уведомления, когда что-то происходит.
- С помощью getSource() мы можем получить экземпляр из AccessibilityNodeInfo, вызвавшего событие. Или мы можем получить корень окна с помощью AccessibilityService.getRootInActiveWindow() а>. И имея это, мы можем пройти всю иерархию внутри приложения.
- AccessibilityNodeInfo не предоставляет никакой информации о z-порядке представлений. , так что невозможно понять, что вверху, а что внизу.
- Нижнее меню находится в том же окне (оно не модальное).
- Если попытаться нажать кнопку "Искать по маршруту" при развернутом нижнем меню, то нижнее меню сворачивается. Так что вы не можете щелкнуть по нему, он находится под меню.
Я просмотрел все параметры AccessibilityNodeInfo, например
isVisibleToUser()
,isClickable()
,isContextClickable()
,isSelected()
,isFocusable()
,isFocused()
,isAccessibilityFocused()
и кнопка имеет те же параметры, когда нижнее меню свернуто/раскрыто. Он виден пользователю, может быть сфокусирован и доступен для кликов.Я просмотрел скрытые API и не вижу ничего полезного.
Что мне не хватает?