提问人:Nikoloz Chitashvili 提问时间:5/14/2021 更新时间:4/27/2023 访问量:511
Google TalkBack 服务如何在按钮/文本/图像/等上绘制矩形?
How Google TalkBack service draws Rectangle over buttons/texts/images/etc.?
问:
在你开始打字之前,我会说你要写下 、 等的文档。AccessibilityService
AccessibilityNodeInfo
我已经正确地实现了我的,我什至正确地得到了 -s。AccessibilityService
AccessibilityEvent
我只关心如何通过用户的点击在视图周围绘制矩形。
到目前为止,我在这方面做了什么:
- 创建自定义视图类,实现
ViewGroup
- 我添加了(我写的类)作为 with ,byt 调用方法
CustomView
View
WindowManager
.addView()
- 我正在通过从重载方法调用来绘制矩形
Canvas
canvas.drawRect()
onDraw()
- 在屏幕上添加视图时,我使用标志和类型将参数传递到方法中
WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY
.addView()
你可能想知道这里有什么问题..
他们来了:
- 使用服务添加新内容时,整个新功能会覆盖屏幕,并且无法访问其他按钮。(除了新添加的图层之外,我真的无法单击任何内容,我认为它被绘制在所有内容之上,并且一切都变得无法单击)
CustomView
WindowManager
View
- 将自定义视图添加为图层而不是直接围绕某些视图绘制,会导致(或不,我不确切知道)存储用户单击的按钮的错误方向。(当我用矩形绘制相同的矩形时,矩形没有完全显示在视图周围,有些坐标是错误的)
event.source.getBoundsInScreen(rect)
onAccessibilityEvent(event: AccessibilityEvent)
canvas.drawRect(rect, mpaint)
我想让我的绘图矩形像 Google TalkBack 一样。AccessibilityService
Google TalkBack 在视图周围绘制了完美的矩形,但不幸的是,我的矩形没有。
- 这是我的应用程序绘制矩形的屏幕截图:(单击“9”)
- 这是Google TalkBack点击“9”按钮的屏幕截图:
谢谢。
答:
2赞
Phil Weaver
5/15/2021
#1
神奇的是,TalkBack 不会画框。它实际上是在应用进程中绘制的。ViewRootImpl 中有代码可以处理它。此功能只能在启用触摸探索功能时使用,这使得它无法用于任何对与 TalkBack 非常相似的用户体验不感兴趣的用户。
期待后续,不,我们不打算开放它。叠加虽然偏移总是很繁琐,但是一种更具可扩展性的方法,可以帮助服务突出显示内容。
评论
0赞
Nikoloz Chitashvili
5/15/2021
所以,据我所知,我几乎不可能像 TalkBack 那样在视图周围绘制矩形,对吗?这太不幸了。然后我会尝试在我的案例中找到一些解决方案。
0赞
timr
1/3/2022
我发现 developer.android.com/reference/android/view/accessibility/...
0赞
timr
1/3/2022
这可以用来在请求的 NodeInfo 上绘制绿色框吗?
1赞
Xlythe
4/27/2023
#2
我注意到,如果减去状态栏高度,对齐方式会有所改善
private void updateBounds(AccessibilityNodeInfo nodeInfo) {
nodeInfo.getBoundsInScreen(mBoundsRect);
mBoundsRect.top -= getStatusBarHeight();
mBoundsRect.bottom -= getStatusBarHeight();
}
private int getStatusBarHeight() {
WindowInsets insets = mWindowManager.getCurrentWindowMetrics().getWindowInsets();
WindowInsetsCompat windowInsets = WindowInsetsCompat.toWindowInsetsCompat(insets);
return windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()).top;
}
但我同样看到边界不一致,是否需要在应用程序和设备的屏幕尺寸上更改偏移量。
评论
0赞
Nikoloz Chitashvili
5/2/2023
嘿,很遗憾,我不再支持这个项目,但谢谢你的帮助!
评论
onDraw
- this.rectToDraw.height() / 2
- this.rectToDraw.height() / 2
packageName
- this.rectToDraw.height() / 2
rectToDraw
onAccessibilityEvent
event.source.getBoundsInScreen(rectangle)
rectangle
Rect
getBoundsInScreen