目标是获取可以与即时进行交互的视图(可以立即单击 进行操作)。如果该视图通常可见且可单击,但已被另一个视图/菜单/侧面板悬停,则应将其省略。
Voice Access执行此操作。而且似乎使用了Accessibility API。
完美的例子是Google地图的底部菜单。展开后,下方的“沿路线搜索”按钮仍然可见,但应用程序未突出显示它们。
我已经浏览了AccessibilityNodeInfo的所有参数,例如isVisibleToUser()
,isClickable()
,isContextClickable()
,isSelected()
,{{1} },isFocusable()
,isFocused()
和收起/展开底部菜单时,按钮具有相同的参数。它对用户可见,可聚焦和可单击。
我研究了隐藏的API,没有发现任何有用的东西。
我缺少什么?
答案 0 :(得分:1)
关键点在于,在AccessibilityService.onAccessibilityEvent()中,树层次结构不是最终的。要获取当前可交互的视图,应延迟调用AccessibilityService.getRootInActiveWindow()。
答案 1 :(得分:1)
AccessibilityNodeInfo#getDrawingOrder()可能会帮助您。请注意,您需要遍历树来确定什么之上。
仍然存在带有透明视图的极端情况,这会给您带来麻烦,但是应该可以让您95%地解决问题。对于这种情况,我们正在寻求更好的答案。