我试图通过开发者选项中的指针位置选项获取触摸的(x,y)坐标,我使用这些坐标使用sendevent点击屏幕。这是我执行sendevent的脚本。
tap.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。
答案 0 :(得分:4)
从getevent获得的X和Y坐标以及从开发人员选项中的指针位置获得的坐标是不一样的。它们使用公式进行映射。
displayX = (x - minX) * displayWidth / (maxX - minX + 1)
displayY = (y - minY) * displayHeight / (maxY - minY + 1)
答案 1 :(得分:2)
启用开发人员选项并启用Pointer Location
,当您点按屏幕时,您可以在屏幕顶部看到x和y坐标,使用这些坐标发送点击事件。
答案 2 :(得分:0)
您是否意识到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不会要求使用十六进制值,因为您(例如)53
和54
工作我会使用的地方
0035
和0036
。
编辑:
在Nexus 5上尝试了原始代码(替换了正确的设备文件)后,我发现没有生成触摸事件(也没有生成十六进制等效项,实验严谨),也没有重用捕获的值(和已转换)来自getevent
。以前,我有更好的经验,使用基于C one here的Python脚本转换事件,并将输出直接写入设备文件。
编辑2:
这个问题here表明初始代码应该有用。