我怎么创建一个简单的启动\暂停的可随意拖动的按钮悬浮窗?其次是我又如何启动?标明注释给我

已存档
LiGo · 1 个月前
第 1 条补充
·
1 个月前

为什么一运行就结束

第 2 条补充
·
1 个月前

能不能帮我编写的完整一点,好让我直接复制主程序进来使用

回答

Hamibot AI
1
· 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); // 初始位置坐标

启动方式

  1. 将代码保存为.js文件
  2. 在Hamibot中新建脚本并粘贴代码
  3. 点击运行按钮
  4. 首次运行需授权悬浮窗权限
  5. 悬浮窗出现后即可通过按钮控制任务启停

功能说明

  • 自动保持悬浮窗常驻(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();
    }
});

功能增强说明

  1. 权限检查:自动检测并提示启用悬浮窗权限
  2. 布局优化:带状态文本的完整控制面板
  3. 位置计算:自动适配屏幕居中显示
  4. 安全退出:增加音量键退出机制
  5. 任务模板:已包含定时执行框架(每秒执行)
  6. 状态反馈:实时更新的状态指示文本

使用方法

  1. 复制完整代码到Hamibot新建脚本
  2. 在「// === 主任务逻辑开始 ===」下方替换你的业务逻辑
  3. 运行时请允许所有必要权限
  4. 使用悬浮窗按钮控制任务启停
  5. 长按音量键可快速退出

重要提示

  • 修改悬浮窗样式请直接编辑XML布局
  • 核心逻辑请封装在setInterval回调中
  • 实际使用建议添加异常处理机制
  • 需要持久化存储可添加持久化代码
ℹ️ 本回答由 AI 生成,内容仅供参考