如何使用 sendevent 和 adb 执行带有“持续时间”的滑动

Fra*_*ank 11 android adb

我正在使用上面的代码来模拟使用 sendevent 的“滑动”:

sendevent /dev/input/event0 3 53 300 ;First position X
sendevent /dev/input/event0 3 54 600 ;First position Y
sendevent /dev/input/event0 3 48 5
sendevent /dev/input/event0 3 58 50
sendevent /dev/input/event0 0 2 0
sendevent /dev/input/event0 0 0 0

sendevent /dev/input/event0 3 53 300  ;Second position X
sendevent /dev/input/event0 3 54 400  ;Second position Y
sendevent /dev/input/event0 0 2 0
sendevent /dev/input/event0 0 0 0

sendevent /dev/input/event0 0 2 0
sendevent /dev/input/event0 0 0 0
Run Code Online (Sandbox Code Playgroud)

但是,它确实会立即滑动而没有任何延迟。

我试图弄清楚如何指定滑动的持续时间,就像您可以使用 adb shell 输入一样:

input [touchscreen|touchpad|touchnavigation] swipe <x1> <y1> <x2> <y2> [duration(ms)]

shell input swipe 300 400 300 200 2000

这会产生持续时间为 2 秒的滑动。

我试图在sleep 2之前添加 a ,;Second position但它确实导致滑动前暂停,而不是持续时间为 2 秒的滑动。

持续时间我的意思是,时间从位置 1 慢慢切换到位置 2。

小智 0

这样做的问题是发送事件sendevent需要一些时间。我制作了一个 python脚本(您可以从那里获取您需要的任何内容),在给定的点之间插入点。它还在点之间等待一段时间。

这是线性插值代码:

def lerp(p1:tuple, p2:tuple, points:int) -> list:
    output = []
    header = [_p2 - _p1 for _p1, _p2 in zip(p1, p2)]
    for p in range(points + 1):
        percent = p / points
        output.append((p1[0] + percent * header[0], p1[1] + percent * header[1]))
    return output
Run Code Online (Sandbox Code Playgroud)

使用多个点时会出现时间问题。使用具有 10 个插值点且它们之间没有时间的路径已经需要 1.29 秒,而 100 个点则需要 11.45 秒。