kotlin Google TalkBack服务如何在按钮/文本/图像等上绘制矩形?

9jyewag0  于 2023-05-01  发布在  Kotlin
关注(0)|答案(2)|浏览(116)

在你开始输入之前,我会说你要写下AccessibilityServiceAccessibilityNodeInfo等的文档。
我已经正确地实现了我的AccessibilityService,我甚至正确地得到了AccessibilityEvent-s。
我只关心如何通过用户的点击在视图周围绘制矩形。
到目前为止,我所做的就是:

  • 创建自定义视图类,实现ViewGroup
  • 我添加了CustomView(我写的类)作为ViewWindowManager,拜特调用.addView()方法
  • 我通过从onDraw()重载方法调用canvas.drawRect()Canvas上绘制矩形
  • 当在屏幕上添加视图时,我使用WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH标志和WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY类型作为参数传递到.addView()方法

你可能想知道这里有什么问题。.
他们是:
1.当使用WindowManager服务添加新的CustomView时,整个新的View覆盖了屏幕,其他按钮无法访问。(我真的不能点击任何东西,除了新添加的层,我认为它正在绘制在所有东西的顶部,所有东西都变得不可点击)
1.添加自定义视图作为一个层,而不是直接在一些视图周围绘制,导致(或不,我不知道确切)onAccessibilityEvent(event: AccessibilityEvent)中的event.source.getBoundsInScreen(rect)存储用户单击按钮的错误方向。(当我用canvas.drawRect(rect, mpaint)绘制相同的矩形时,矩形并不完全围绕视图显示,有些坐标是错误的)
我 * 想 * 让我的AccessibilityServiceGoogle TalkBack那样画矩形。
Google TalkBack在视图周围绘制了完美的矩形,但不幸的是,我的没有。

  • 下面是我的应用程序绘制矩形的截图:(点击“9”)

  • 下面是Google TalkBack点击“9”按钮的截图:

谢谢。

rfbsl7qr

rfbsl7qr1#

神奇的是TalkBack * 不会 * 画盒子。它实际上是在应用程序进程中绘制的。ViewRootImpl中有处理它的代码。此功能只能在启用Touch Exploration时使用,这使得它无法用于对与TalkBack非常相似的用户体验不感兴趣的任何内容。
预计后续行动,不,我们不打算打开这个。覆盖,虽然偏移量总是很麻烦,但它是一种更具可扩展性的方法,可以帮助服务突出显示内容。

hrirmatl

hrirmatl2#

我注意到如果你减去状态栏的高度,对齐效果会更好

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;
}

但我同样看到边界是不一致的,是否需要偏移量在应用程序和设备的屏幕大小上发生了变化。

相关问题