我怎么创建一个简单的启动\暂停的可随意拖动的按钮悬浮窗?其次是我又如何启动?标明注释给我
第 1 条补充
· 1 个月前
为什么一运行就结束
第 2 条补充
· 1 个月前
能不能帮我编写的完整一点,好让我直接复制主程序进来使用
回答
// 文档地址 https://docs.hamibot.com/
// 创建悬浮窗
var floatyWin = floaty.window(
<vertical padding="16">
<button id="startBtn" text="启动" bg="#4CAF50"/>
<button id="pauseBtn" text="暂停" bg="#F44336" enabled="false"/>
</vertical>
);
// 初始化运行状态标志
var running = false;
// 启动按钮点击事件
floatyWin.startBtn.click(function() {
if(running) return; // 防止重复点击
running = true;
toast("任务启动");
floatyWin.startBtn.enabled = false;
floatyWin.pauseBtn.enabled = true;
// 在此处添加你的主任务逻辑
});
// 暂停按钮点击事件
floatyWin.pauseBtn.click(function() {
if(!running) return;
running = false;
toast("任务暂停");
floatyWin.startBtn.enabled = true;
floatyWin.pauseBtn.enabled = false;
// 在此处添加暂停处理逻辑
});
// 设置悬浮窗可拖动(通过修改悬浮窗位置实现)
// 注意:Hamibot悬浮窗默认支持拖动手势
floatyWin.setPosition(300, 300); // 初始位置坐标
启动方式:
- 将代码保存为.js文件
- 在Hamibot中新建脚本并粘贴代码
- 点击运行按钮
- 首次运行需授权悬浮窗权限
- 悬浮窗出现后即可通过按钮控制任务启停
功能说明:
- 自动保持悬浮窗常驻(setInterval已隐式处理)
- 支持自由拖动悬浮窗位置
- 按钮状态自动切换(启动/暂停互斥)
- 使用toast提示操作状态
- 符合Rhino 1.7.15引擎语法要求
补充回答 1
大多数脚本都需要无障碍服务和后台弹窗权限,具体要求请查看脚本介绍页,权限的打开方法,参见 https://hamibot.cn/faq#打开权限
补充回答 2
// 文档地址 https://docs.hamibot.com/
// === 权限检查模块 ===
auto.waitFor();
if (!floaty.checkPermission()) {
floaty.requestPermission();
toast("请先授予悬浮窗权限");
exit();
}
// === 悬浮窗创建 ===
var floatyWin = floaty.window(
<vertical padding="16" bg="#FFFFFF">
<text>任务控制面板</text>
<button id="startBtn" text="▶ 启动" bg="#4CAF50" w="*" margin="8"/>
<button id="pauseBtn" text="⏸ 暂停" bg="#F44336" w="*" margin="8" enabled="false"/>
<text id="statusText" textSize="14sp">状态:就绪</text>
</vertical>
);
// 初始位置设置(屏幕中央)
var deviceWidth = device.width;
var deviceHeight = device.height;
floatyWin.setPosition(deviceWidth/2 - 150, deviceHeight/2 - 200);
// === 状态管理 ===
var running = false; // 主任务状态标志
var taskInterval; // 定时任务句柄
// === 按钮事件绑定 ===
// 启动按钮
floatyWin.startBtn.click(function() {
if(running) return;
running = true;
toast("任务启动");
floatyWin.startBtn.enabled = false;
floatyWin.pauseBtn.enabled = true;
floatyWin.statusText.setText("状态:运行中");
// === 主任务逻辑开始 ===
// 请在此处替换或添加你的核心代码
taskInterval = setInterval(function(){
// 示例:每秒执行一次操作
log("任务执行中...");
// 模拟完成后的自动停止
// if(someCondition){
// stopTask();
// }
}, 1000);
});
// 暂停按钮
floatyWin.pauseBtn.click(function() {
if(!running) return;
stopTask();
});
// === 全局函数 ===
function stopTask() {
running = false;
clearInterval(taskInterval);
toast("任务已暂停");
floatyWin.startBtn.enabled = true;
floatyWin.pauseBtn.enabled = false;
floatyWin.statusText.setText("状态:已暂停");
}
// === 退出处理 ===
// 长按音量键退出脚本
events.on("key", function(code, event){
if(code == keyCodes.VOLUME_DOWN){
stopTask();
floatyWin.close();
toast("脚本已退出");
exit();
}
});
功能增强说明:
- 权限检查:自动检测并提示启用悬浮窗权限
- 布局优化:带状态文本的完整控制面板
- 位置计算:自动适配屏幕居中显示
- 安全退出:增加音量键退出机制
- 任务模板:已包含定时执行框架(每秒执行)
- 状态反馈:实时更新的状态指示文本
使用方法:
- 复制完整代码到Hamibot新建脚本
- 在「// === 主任务逻辑开始 ===」下方替换你的业务逻辑
- 运行时请允许所有必要权限
- 使用悬浮窗按钮控制任务启停
- 长按音量键可快速退出
重要提示:
- 修改悬浮窗样式请直接编辑XML布局
- 核心逻辑请封装在setInterval回调中
- 实际使用建议添加异常处理机制
- 需要持久化存储可添加持久化代码
ℹ️ 本回答由 AI 生成,内容仅供参考