autojs在android7以上系统支持了一些手势模拟操作,可以是基于控件也可以是基于指定屏幕坐标的,本文主要介绍基于坐标的几个手势模拟方法。
在介绍手势模拟方法前先介绍一个可根据屏幕分辨率的变化,自适应调整坐标的方法:
假如我们设置点击坐标(300,2200),在2400 x 1080 像素的手机中可以正常生效,而当运行在1920 x 1080 像素的手机上时,会因为坐标超出屏幕范围不生效。
因此可以使用一个设定屏幕分辨率的方法setScreenMetrics(width, height)
来告诉脚本基于怎样的屏幕分辨率去运行,例如
setScreenMetrics(1080,2400);
click(300,2200);//点击该坐标
当在1920 x 1080 像素的手机上运行时,将会自动根据预设屏幕分辨率和实际屏幕分辨率的比值来放缩屏幕
300 x 1080/1080 = 300
2200 x 1920/2400 = 1760
即实际将会点击坐标(300,1760)
click(x,y);
x:值为number,要点击的屏幕横坐标,从左至右
y:值为number,要点击的屏幕纵坐标,从上至下
是最简单最常见的模拟点击方式,模拟点击坐标(x, y),并会返回是否点击成功。只有在点击执行完成后脚本才继续执行。
点击时长大约150毫秒,如果被其他事件中断(例如用户自行点击)会点击失败。
longClick(x, y);
模拟长按坐标(x, y), 并返回是否成功。
只有在长按执行完成(大约600毫秒)时脚本才会继续执行。
长按过程中被其他事件中断(例如用户自行点击)会长按失败。
press(x, y, duration);
x:值为number,要点击的屏幕横坐标,从左至右
y:值为number,要点击的屏幕纵坐标,从上至下
duration:值为number,点按的时长,单位毫秒
模拟点按坐标(x, y)指定的时长,并返回是否成功。只有按住操作执行完成时脚本才会继续执行。
如果按住时间过短,那么会被系统认为是点击;如果时长超过500毫秒,则认为是长按。
一般而言,只有按住过程中被其他事件中断才会操作失败。
swipe(x1, y1, x2, y2, duration);
x1:滑动的起始坐标的x值
y1: 滑动的起始坐标的y值
x2:滑动的结束坐标的x值
y2:滑动的结束坐标的y值
duration:滑动时长,单位毫秒
模拟在指定时长从坐标(x1, y1)滑动到坐标(x2, y2),并返回是否成功。只有滑动操作执行完成时脚本才会继续执行。
一般而言,只有滑动过程中被其他事件中断才会滑动失败。
gesture(duration, [x1, y1], [x2, y2], ...);
显而易见的意思。在指定时长从坐标(x1,y1)滑到(x2,y2)滑到…
需要注意的是,duration设定的是单次两点滑动期间的时长间隔
例如gesture(1000, [0, 0], [500, 500], [500, 1000])
为模拟一个从(0, 0)到(500, 500)到(500, 100)的手势操作,时长为2秒
基于滑动的手势可以实现更复杂的手势例如放大,捏合,旋转等操作,需要多个滑动手势同时运行,因此推荐下述方法:
gestures([delay1, duration1, [x1, y1], [x2, y2], ...], [delay2, duration2, [x3, y3], [x4, y4], ...], ...)
gestures()
方法将多个手势(注意,只能是滑动手势)作为参数放在方括号中同时运行。
delay:该组滑动执行时单次滑动之间的间隔事件,单位毫秒,默认值0
duration:该组滑动执行时单次滑动的持续时长
[x1,y1],[x2,y2]…:该组滑动的点坐标
例如模拟手指的捏合
gestures([0, 500, [800, 300], [500, 1000]],
[0, 500, [300, 1500], [500, 1000]]);
需要注意的是,以上介绍的所有手势模拟方法都 不能同时运行 \color{Red}{不能同时运行} 不能同时运行,必须等待一个手势执行结束后才能执行下一个,若想实现如同时点击多点操作,则建议学习多线程操作。