【问题标题】:Getevent and pointer location获取事件和指针位置
【发布时间】:2014-06-05 14:13:51
【问题描述】:

我正在尝试通过开发人员选项中的指针位置选项获取触摸的 (x, y) 坐标,并使用这些坐标使用 sendevent 在屏幕上点击。这是我执行发送事件的脚本。

点击.sh sendevent /dev/input/event0 3 57 2421 sendevent /dev/input/event0 3 58 232 sendevent /dev/input/event0 3 53 $1 sendevent /dev/input/event0 3 54 $2 sendevent /dev/input/event0 0 0 0 sendevent /dev/input/event0 3 57 4294967295 sendevent /dev/input/event0 0 0 0

我从 adb shell sh tap.sh <x> <y> 调用脚本,但它没有点击正确的坐标。相反,它在不同的位置敲击。

当我点击屏幕并在 getevent adb shell getevent 中检查结果时。我发现指针位置和getevent上显示的坐标不同。

为什么它们不同,我该如何解决这个问题?

PS:我试用的设备是 Nexus 7、Nexus 10。

【问题讨论】:

标签: android touch adb


【解决方案1】:

getevent获取的X和Y坐标与开发者选项中指针位置获取的坐标不一样。它们使用公式进行映射。

displayX = (x - minX) * displayWidth / (maxX - minX + 1)
displayY = (y - minY) * displayHeight / (maxY - minY + 1)

来源:Touch Devices

【讨论】:

  • 你有什么想法,如何在最新的android版本(Q OS,安全补丁> feb 2020)中使用“adb shell dumpsys input”获取Screen_X和Screen_Y?
  • 您可以使用 dumpsys 获取 displayHeight/Width,使用“adb shell -- getevent -lp /dev/input/eventXXX”获取最小/最大 x/y 值。只需添加您的特定事件 ID。
【解决方案2】:

打开开发者选项并启用Pointer Location,您可以在点击屏幕时看到屏幕顶部的 x 和 y 坐标,使用这些坐标发送点击事件。

【讨论】:

  • 我可以在我的应用程序中获取这些 x,y 吗?
【解决方案3】:

您是否知道 getevent(根据我的经验,这可能因设备而异)显示基数为 16 的值?

(旁注:getevent -l 通常更容易阅读,因为它会打印事件类型的字符串表示)

即如果getevent -l

/dev/input/event1: EV_ABS       ABS_MT_POSITION_X    000001cb       
/dev/input/event1: EV_ABS       ABS_MT_POSITION_Y    00000376

触摸的位置其实是(459, 886)

但是,如果您的代码完全有效,sendevent 似乎没有遵循要求十六进制值的要求,因为您的(例如)5354 在我本来会使用的地方工作 00350036

编辑:

在 Nexus 5 上尝试了原始代码(替换了正确的设备文件)后,我发现没有生成触摸事件(也没有当十六进制等效项被替换时,为了实验的严谨性),也没有重用捕获的值(和转换)来自getevent。以前,我有更好的经验,使用基于 C 的 Python 脚本here 转换事件,并将输出直接写入设备文件。

编辑 2:

这个问题here 建议初始代码应该可以工作。

【讨论】:

    猜你喜欢
    • 2012-02-15
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多