在你开始打字之前,我想说你要写下 AccessibilityService
、AccessibilityNodeInfo
等的文档。
我已经正确实现了 AccessibilityService
,而且我什至正确地获取了 AccessibilityEvent
-s。
我只关心如何通过用户的点击在 View 周围绘制矩形。
到目前为止我对此所做的事情:
- 创建了实现
ViewGroup
的自定义 View 类 - 我通过调用
.addView() 将
方法CustomView
(我编写的类)添加为带有WindowManager
的View
- 我通过从
onDraw()
重载方法调用canvas.drawRect()
在Canvas
上绘制矩形 - 在屏幕上添加 View 时,我使用
WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
标志和WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY
类型将参数传递给.addView()
方法
您可能想知道这里出了什么问题..
他们在这里:
- 使用
WindowManager
服务添加新的CustomView
时,整个新的View
覆盖屏幕,并且其他按钮无法访问。 (除了新添加的图层之外,我实际上无法单击任何内容,我认为它被绘制在所有内容之上,并且所有内容都变得不可单击) - 将自定义 View 添加为图层,而不是直接在某些 View 周围绘制,会导致(或不,我不确切知道)
onAccessibilityEvent( 中的
来存储用户点击按钮的错误方向。 (当我使用canvas.drawRect(rect, mpaint)绘制相同的矩形时,矩形没有完全显示在 View 周围,一些坐标是错误的)event.source.getBoundsInScreen(rect)
event: AccessibilityEvent)
我想要让我的AccessibilityService
绘制像Google TalkBack这样的矩形做到了。
Google TalkBack 在 View 周围绘制了完美矩形,但不幸的是,我的却没有。
- 以下是我的应用绘制矩形的屏幕截图:(单击“9”)
- 以下是 Google TalkBack 点击“9”按钮的屏幕截图:
谢谢。
最佳答案
神奇的是 TalkBack 不会绘制方框。它实际上是在app进程中绘制的。 ViewRootImpl 中有处理它的代码。此功能只能在启用触摸探索时使用,这使得它无法用于任何对与 TalkBack 非常相似的用户体验不感兴趣的地方。
预计后续行动,不,我们不打算公开此事。虽然偏移总是很繁琐,但叠加层是一种更具可扩展性的方法,可以帮助服务突出显示内容。
关于android - Google TalkBack 服务如何在按钮/文本/图像/等上绘制矩形?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67526792/