Autox.js 坐标操作 click swipe 手势 基于像素的屏幕操作
当语义点击没用时
上一组讲的选择器 API 建立在无障碍服务的"语义点击"之上——向控件发送 action click 事件。但不是所有 App 都响应这个事件:
- 游戏引擎(Unity、Unreal)完全自绘,没有 Android 控件树
- 部分自绘 App(某些银行、安全类应用)屏蔽了无障碍事件
- WebView 内嵌页面 不一定暴露控件信息
这时候就得退一步,用坐标像素直接操作屏幕。
基础坐标操作
// 点击 (x, y)
click(540, 1200);
// 长按
longClick(540, 1200);
// 滑动:从 (x1, y1) 到 (x2, y2),持续 duration 毫秒
swipe(100, 1500, 1000, 500, 300);
// 模拟按键
home(); // Home 键
back(); // 返回键
recent(); // 最近任务
powerDialog(); // 电源菜单
多指手势
gestures() 可以同时模拟多个手指:
// 两指捏合缩小(类似双指缩放)
gestures([
0, // 延迟 0 毫秒开始
[540, 1000], // 手指 A 起点
[440, 1000], // 手指 A 终点(向左移动)
], [
0,
[640, 1000], // 手指 B 起点
[740, 1000], // 手指 B 终点(向右移动)
]);
// 三个手指同时操作
gestures([delay1, duration1, x1, y1, x2, y2],
[delay2, duration2, x1, y1, x2, y2],
[delay3, duration3, x1, y1, x2, y2]);
从控件取坐标
坐标是像素级的,你得知道点哪里。常用的方法是从选择器拿到控件,再取它的 bounds:
let btn = className("Button").text("确定").findOne();
let b = btn.bounds();
// bounds 是 { left, top, right, bottom }
// 取中心点击
click((b.left + b.right) / 2, (b.top + b.bottom) / 2);
// 或用短名
click(b.centerX(), b.centerY());
Root 增强模式
Autox.js 的坐标操作有两种实现方式:
| 模式 | 是否需要 Root | 说明 |
|---|---|---|
| 无障碍坐标操作 | 不需要 | 通过无障碍服务发送 touch 事件,部分 App 不响应 |
| Root shell | 需要 | 通过 input tap x y 命令发送真实触摸事件,成功率更高 |
在有 Root 的设备上,可以开启 Root 增强模式:
// 检查是否有 Root
console.log(auto.rootAvailable());
// 开启 Root 模式(某些版本自动使用,不需手动开)
auto.rootMode = true;
Root 模式还能:
- 执行任意 shell 命令
shell("ls /sdcard/") - 获取屏幕真实分辨率
device.width/device.height - 更稳定的滑动和手势
坐标操作的致命缺点:分辨率绑定
click(540, 1200); // 这在 1080x2400 的手机上有效
// 换到 720x1600 的手机上点偏了
所以坐标脚本必须配合以下措施使用:
1. 用相对比例计算
let w = device.width; // 屏幕宽度
let h = device.height; // 屏幕高度
// 点屏幕中心偏下的位置
click(w * 0.5, h * 0.7);
2. 图像识别定位
更推荐的方式——先找图,拿到图的中心坐标,再点击:
// 截屏后在内存中找"确认按钮"的图像模板
let img = captureScreen();
let result = images.findImage(img, "confirm_button.png");
if (result) {
click(result.x, result.y); // 点击找到的中心
}
详见图像识别模块页。
实战:游戏自动战斗
// 假设这是个游戏,没有控件树,必须用坐标
let w = device.width;
let h = device.height;
console.show();
toast("开始自动战斗脚本");
// 战斗循环
for (let i = 0; i < 100; i++) {
// 点击屏幕中央附近(攻击按钮大致位置)
click(w * 0.5, h * 0.85);
sleep(1500);
// 向右滑(释放技能)
swipe(w * 0.2, h * 0.5, w * 0.8, h * 0.5, 300);
sleep(2000);
// 偶发地向左滑
if (Math.random() < 0.3) {
swipe(w * 0.8, h * 0.5, w * 0.2, h * 0.5, 300);
sleep(1000);
}
}
toast("战斗结束");
调试坐标操作
坐标点不准时,可以用这个小脚本快速标记:
// 显示当前坐标(悬浮窗)
auto.requestPermission(); // 确保无障碍已开
auto.setInterval(() => {
console.clear();
console.log("当前屏幕:" + device.width + "x" + device.height);
console.log("左上角 (0,0) 右下角 (" + device.width + "," + device.height + ")");
}, 1000);
或者用悬浮窗录制功能——它录制的就是你手指实际点击的坐标,能直接看到你操作的数值。
总结
| 场景 | 推荐方案 |
|---|---|
| 标准 Android App | 选择器 API(语义点击) |
| 游戏、自绘 App | 坐标操作 + 图像识别 |
| 两者混合 | 尽量用选择器,找不到的退化到图像识别 + 坐标 |
坐标操作是备选方案,能不用就不用——跨分辨率、跨设备的稳定性是脚本能不能长期跑的关键。