auto.js 中文文档 下载 App

自定义悬浮窗——floaty 模块创建持久化小面板

为什么要自己创建悬浮窗

Auto.js 自带的小浮球只有「运行状态 + 停止」两个功能,不够用的时候可以用 floaty.rawWindow() 创建自己的悬浮窗:

创建悬浮窗

var w = floaty.rawWindow(
  <frame gravity="center">
    <text id="status" text="运行中" textColor="#fff" bg="#66000000" textSize="14sp" padding="10">
    </text>
  </frame>
);

w.setPosition(500, 2000); // 初始位置(像素)

rawWindow 里的 XML 格式和 UI 布局一致(见 UI 布局),但属性和事件绑定有差异。

更新悬浮窗内容

// 子线程更新需要 ui.run 吗?不用,悬浮窗有自己的线程
w.status.setText("剩余 3 个任务");
w.status.setTextColor("#ff00"); // 绿色

悬浮窗拖动

floaty.rawWindow 的默认实现可能不支持拖动
// 可以监听触摸事件自己实现拖动
var isDragging = false;
var startX, startY, windowX, windowY;

w.setTouchListener(function(view, event) {
  switch (event.getAction()) {
    case event.ACTION_DOWN:
      isDragging = true;
      startX = event.getRawX();
      startY = event.getRawY();
      windowX = w.getX();
      windowY = w.getY();
      return true;
    case event.ACTION_MOVE:
      if (isDragging) {
        w.setPosition(windowX + (event.getRawX() - startX),
                      windowY + (event.getRawY() - startY));
      }
      return true;
    case event.ACTION_UP:
      isDragging = false;
      return true;
  }
  return false;
});

关闭悬浮窗

w.close();

脚本退出时记得清理:

events.on("exit", function() {
  w.close();
});

实战:任务进度面板

var w = floaty.rawWindow(
  <vertical bg="#cc000000" padding="8">
    <text id="title" text="Auto.js 任务" textColor="#fff" textSize="12sp"/>
    <progressbar id="pb" max="100" progress="0" w="150"/>
    <text id="detail" text="准备中..." textColor="#aaa" textSize="10sp"/>
  </vertical>
);

// 主逻辑
var total = 10;
for (var i = 0; i < total; i++) {
  w.pb.setProgress(i / total * 100);
  w.detail.setText("处理中 " + (i+1) + "/" + total);
  sleep(1000);
}

w.pb.setProgress(100);
w.detail.setText("全部完成 ✓");
sleep(2000);
w.close();