Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/221.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 谷歌对讲服务如何在按钮/文本/图像等上绘制矩形。?_Android_Kotlin_Canvas_Ondraw_Accessibilityservice - Fatal编程技术网

Android 谷歌对讲服务如何在按钮/文本/图像等上绘制矩形。?

Android 谷歌对讲服务如何在按钮/文本/图像等上绘制矩形。?,android,kotlin,canvas,ondraw,accessibilityservice,Android,Kotlin,Canvas,Ondraw,Accessibilityservice,在你开始打字之前,我想说你要写下AccessibilityService,AccessibilityNodeInfo,等等的文档 我已经正确地实现了我的可访问性服务,甚至正确地获得了可访问性事件-s 我只关心如何通过用户的点击在视图周围绘制矩形 到目前为止,我在这方面做了什么: 创建了自定义视图类,该类实现了ViewGroup 我通过调用.addView()方法将CustomView(我编写的类)添加为带有WindowManager的视图 我通过调用onDraw()重载方法中的Canvas.d

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

我已经正确地实现了我的
可访问性服务
,甚至正确地获得了
可访问性事件
-s

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

到目前为止,我在这方面做了什么:

  • 创建了自定义视图类,该类实现了
    ViewGroup
  • 我通过调用
    .addView()
    方法将
    CustomView
    (我编写的类)添加为带有
    WindowManager
    视图
  • 我通过调用
    onDraw()
    重载方法中的
    Canvas.drawRect()
    Canvas
    上绘制矩形
  • 在屏幕上添加视图时,我使用
    WindowManager.LayoutParams.FLAG\u WATCH\u OUTSIDE\u TOUCH
    FLAG和
    WindowManager.LayoutParams.TYPE\u ACCESSIBILITY\u OVERLAY
    键入要传递到
    .addView()
    方法中的参数
你可能想知道这里有什么问题

这是:

  • 使用
    WindowManager
    服务添加新的
    CustomView
    时,整个新的
    View
    会覆盖屏幕,无法访问其他按钮。(除了新添加的图层,我简直无法点击任何东西,我认为它被绘制在所有图层之上,所有图层都变得不可点击)
  • 将自定义视图添加为一个层而不是直接围绕某个视图绘制,会导致(或者不是,我不知道确切情况)onAccessibilityEvent(event:AccessibilityEvent)中的
    event.source.getBoundsInScreen(rect)
    存储用户单击的按钮的错误方向。(当我用
    canvas.drawRect(rect,mpaint)
    绘制同一个矩形时,该矩形没有精确显示在视图周围,某些坐标是错误的)
  • 我想让我的
    AccessibilityService
    像它那样画矩形

    Google TalkBack在视图周围绘制了PERFECT矩形,但不幸的是,我的没有

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

    • 以下是点击“9”按钮的谷歌对讲的屏幕截图:


    谢谢。

    神奇的是,对讲机不会吸引观众。它实际上是在应用程序过程中绘制的。ViewRootImpl中有处理它的代码。此功能只能在启用触摸探索时使用,这使得它无法用于任何对与TalkBack非常类似的用户体验不感兴趣的东西


    期待后续行动,不,我们不打算公开这个。覆盖,虽然偏移总是很精细,但它是一种更具可伸缩性的方法,可以帮助服务突出显示内容。

    在技术方面对您所做的工作没有帮助,但该矩形看起来偏移了视图高度的一半-您确定您没有错算坐标吗?嘿,谢谢您的回复!这是onDraw的代码。我在计算坐标时添加了
    -this.rectToDraw.height()/2
    ,但这在另一个应用程序中不起作用:/这里也是。奇怪的是,添加
    -this.rectToDraw.height()/2
    就像计算器上的符咒。此处正确显示了矩形。。笑死我了。。我想我需要检查
    packageName
    ,然后再减去
    -this.rectToDraw.height()/2
    ,如果显示的是另一个包,则为计算器。您从哪里获得
    rectToDraw
    ?就像我说的,我对你正在使用的可访问性的东西一无所知,但是看起来你正在做的基本上是有效的,只是有一个非常可疑的50%偏移量的事情正在发生。在计算宽度/高度/x和y偏移时,是否考虑了填充?带有紫色按钮的图像看起来有垂直的填充或边距,但是计算器按钮不能从提供给我的
    event.source.getBoundsInScreen(矩形)
    rectangle
    对象的
    onAccessibilityEvent
    中直接绘制。我明白你的意思,也许紫色按钮有填充物之类的东西,但为什么谷歌对讲可以像在计算器中一样画矩形呢?:/我认为对讲机的智商要高出200,然后只需获得
    getBoundsInScreen
    并绘制矩形。我会再次检查坐标计算。所以,正如我理解的答案,我几乎不可能像TalkBack那样画出视图周围的矩形,是吗?那太不幸了。那么我会在我的案例中找到一些解决方案。