自定义悬浮窗——floaty 模块创建持久化小面板
为什么要自己创建悬浮窗
Auto.js 自带的小浮球只有「运行状态 + 停止」两个功能,不够用的时候可以用 floaty.rawWindow() 创建自己的悬浮窗:
- 实时显示脚本运行状态(当前执行到哪一步、剩余时间)
- 提供控制按钮(暂停 / 继续 / 跳过)
- 临时日志窗口(不用切回 Auto.js 主界面看 log)
- 自定义快捷键面板
创建悬浮窗
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();