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