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

标签 android kotlin canvas ondraw accessibilityservice

在你开始打字之前,我想说你要写下 AccessibilityServiceAccessibilityNodeInfo 等的文档。

我已经正确实现了 AccessibilityService,而且我什至正确地获取了 AccessibilityEvent-s。

我只关心如何通过用户的点击在 View 周围绘制矩形。

到目前为止我对此所做的事情:

  • 创建了实现 ViewGroup 的自定义 View 类
  • 我通过调用 .addView() 将 CustomView (我编写的类)添加为带有 WindowManagerView方法
  • 我通过从 onDraw() 重载方法调用 canvas.drawRect()Canvas 上绘制矩形
  • 在屏幕上添加 View 时,我使用 WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH 标志和 WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY 类型将参数传递给 .addView() 方法

您可能想知道这里出了什么问题..

他们在这里:

  1. 使用 WindowManager 服务添加新的 CustomView 时,整个新的 View 覆盖屏幕,并且其他按钮无法访问。 (除了新添加的图层之外,我实际上无法单击任何内容,我认为它被绘制在所有内容之上,并且所有内容都变得不可单击)
  2. 将自定义 View 添加为图层,而不是直接在某些 View 周围绘制,会导致(或不,我不确切知道)onAccessibilityEvent( 中的 event.source.getBoundsInScreen(rect) event: AccessibilityEvent) 来存储用户点击按钮的错误方向。 (当我使用canvas.drawRect(rect, mpaint)绘制相同的矩形时,矩形没有完全显示在 View 周围,一些坐标是错误的)

想要让我的AccessibilityService绘制像Google TalkBack这样的矩形做到了。

Google TalkBack 在 View 周围绘制了完美矩形,但不幸的是,我的却没有。

  • 以下是我的应用绘制矩形的屏幕截图:(单击“9”)

mine screen

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

talkbacks screen

谢谢。

最佳答案

神奇的是 TalkBack 不会绘制方框。它实际上是在app进程中绘制的。 ViewRootImpl 中有处理它的代码。此功能只能在启用触摸探索时使用,这使得它无法用于任何对与 TalkBack 非常相似的用户体验不感兴趣的地方。

预计后续行动,不,我们不打算公开此事。虽然偏移总是很繁琐,但叠加层是一种更具可扩展性的方法,可以帮助服务突出显示内容。

关于android - Google TalkBack 服务如何在按钮/文本/图像/等上绘制矩形?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67526792/

相关文章:

android - 用户没有定义无参数构造函数

android - 在 Kitkat 上没有 LAUNCHER 时的 BroadcastReceiver

android - 从一个项目中调用另一个项目中的类?

android - 如何使用 Kotlin 创建自定义 View 的构造函数

java - RecyclerView 中的焦点效果 - 如何将项目置于前面?

android - 在 JetPack Composable 中观察 LiveData

php - 将 base64 图像从 php 查询传递到 html5 canvas

javascript - 无法使用react-konva为线条提供渐变

properties - 如何实现从某个来源提取的属性,直到直接在 Kotlin 中设置它?

html - 如何使 Foundation 5 Canvas 外导航菜单具有粘性?