Autox.js 中文文档 下载 App

Autox.js 坐标操作 click swipe 手势 基于像素的屏幕操作

当语义点击没用时

上一组讲的选择器 API 建立在无障碍服务的"语义点击"之上——向控件发送 action click 事件。但不是所有 App 都响应这个事件:

这时候就得退一步,用坐标像素直接操作屏幕。

基础坐标操作

// 点击 (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 模式还能:

坐标操作的致命缺点:分辨率绑定

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坐标操作 + 图像识别
两者混合尽量用选择器,找不到的退化到图像识别 + 坐标

坐标操作是备选方案,能不用就不用——跨分辨率、跨设备的稳定性是脚本能不能长期跑的关键。