如何通过adb的sendevent命令实现可指定时长的滑动操作
实现sendevent可控时长匀速滑动的方案
核心原理
sendevent是向系统发送原始输入事件的底层工具,仅发送起点和终点坐标会被识别为瞬间完成的滑动。要实现指定时长的匀速滑动,需要把整个滑动路径拆分为N个细小的步进坐标,每发送一个步进的触摸事件后间隔极短时间,所有步进的总间隔时长等于需要的滑动总时长。
具体实现示例
以下是对应你需求的Shell脚本示例,可实现2秒内从(300,600)匀速滑动到(300,400)的效果:
#!/bin/sh # 滑动参数配置 X1=300 Y1=600 X2=300 Y2=400 DURATION=2000 # 滑动总时长,单位毫秒 STEP_INTERVAL=10 # 步进间隔,单位毫秒,建议设为5-10保证滑动顺滑 # 计算总步长、每步坐标增量 TOTAL_STEPS=$((DURATION / STEP_INTERVAL)) DELTA_X=$(( (X2 - X1) / TOTAL_STEPS )) DELTA_Y=$(( (Y2 - Y1) / TOTAL_STEPS )) # 1. 发送起点按下事件 sendevent /dev/input/event0 3 53 $X1 sendevent /dev/input/event0 3 54 $Y1 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 # 2. 循环发送步进滑动事件 CUR_X=$X1 CUR_Y=$Y1 step=1 while [ $step -le $TOTAL_STEPS ] do CUR_X=$((CUR_X + DELTA_X)) CUR_Y=$((CUR_Y + DELTA_Y)) # 发送当前步进坐标事件 sendevent /dev/input/event0 3 53 $CUR_X sendevent /dev/input/event0 3 54 $CUR_Y sendevent /dev/input/event0 0 2 0 sendevent /dev/input/event0 0 0 0 # 等待步进间隔,usleep单位为微秒 usleep $((STEP_INTERVAL * 1000)) step=$((step + 1)) done # 3. 修正终点坐标,避免整数除法误差导致不到位 sendevent /dev/input/event0 3 53 $X2 sendevent /dev/input/event0 3 54 $Y2 sendevent /dev/input/event0 0 2 0 sendevent /dev/input/event0 0 0 0 # 4. 发送抬起事件 sendevent /dev/input/event0 0 2 0 sendevent /dev/input/event0 0 0 0
注意事项
- 若运行环境没有
usleep命令,可替换为sleep $(awk "BEGIN {print $STEP_INTERVAL/1000}")实现浮点延时,精度略低于usleep - 部分设备需要额外设置触摸追踪ID,可在按下事件部分添加
sendevent /dev/input/event0 3 57 0,抬起事件部分添加sendevent /dev/input/event0 3 57 -1 - 可根据实际需求修改开头的坐标、时长参数,适配不同的滑动场景
内容的提问来源于stack exchange,提问作者user14881255
相关产品推荐
相关产品推荐

