帮我写一个代码,点击设置按钮,可以弹出设置窗口,设置a和b的值,点运行按钮可以显示a和b的值。

090909 · 8 小时前
第 1 条补充
·
8 小时前

我是想悬浮两个按钮,一个是设置,一个是运行。点击设置弹出两个文本框的悬浮窗,分别设置a和b的值,保存后,点击运行显示a和b的值。

第 2 条补充
·
8 小时前

运行这个脚本hamibot就闪退了,怎么修复

回答

Hamibot AI
1
· 8 小时前

Hamibot 设置窗口脚本

以下是一个完整的 UI 脚本,实现设置按钮弹出设置窗口,运行按钮显示 a 和 b 的值:

// 文档地址 https://docs.hamibot.com/

"ui";

// 定义全局变量存储 a 和 b 的值
var aValue = 0;
var bValue = 0;

// 设置 UI 布局
ui.layout(
    <vertical padding="16">
        <text text="Hamibot 设置演示" textSize="18sp" textStyle="bold" margin="8"/>
        <card w="*" h="auto" margin="8" cardCornerRadius="8">
            <vertical padding="16">
                <text text="当前设置值" textSize="14sp" textStyle="bold"/>
                <text id="displayText" text="a: 0, b: 0" textSize="14sp" margin="8 0"/>
            </vertical>
        </card>
        <linear>
            <button id="settingBtn" text="设置" w="0" layout_weight="1" margin="8"/>
            <button id="runBtn" text="运行" w="0" layout_weight="1" margin="8"/>
        </linear>
    </vertical>
);

// 设置按钮点击事件 - 弹出设置窗口
ui.settingBtn.click(function() {
    // 使用 dialogs 创建输入对话框
    var dialog = dialogs.build({
        title: "设置参数",
        positive: "确定",
        negative: "取消",
        inputPrefill: aValue + "," + bValue
    })
    .on("input", function(text, dialog) {
        // 解析输入的值,格式为 a,b
        var values = text.split(",");
        if (values.length >= 2) {
            aValue = parseInt(values[0]);
            bValue = parseInt(values[1]);
            // 更新显示文本
            ui.displayText.setText("a: " + aValue + ", b: " + bValue);
            toast("设置成功!a=" + aValue + ", b=" + bValue);
        } else {
            toast("请输入正确的格式:a,b");
        }
    })
    .show();
});

// 运行按钮点击事件 - 显示 a 和 b 的值
ui.runBtn.click(function() {
    // 显示当前 a 和 b 的值
    toast("运行结果:a=" + aValue + ", b=" + bValue);
    
    // 同时在界面上显示
    ui.displayText.setText("a: " + aValue + ", b: " + bValue);
    
    // 也可以使用 alert 弹窗显示
    // alert("运行结果", "a=" + aValue + ", b=" + bValue);
});

// 初始化显示
ui.displayText.setText("a: " + aValue + ", b: " + bValue);

使用说明

功能说明

按钮 功能
设置 弹出输入框,输入 a,b 的值(用逗号分隔)
运行 显示当前 a 和 b 的值

使用步骤

  1. 在 Hamibot 控制台创建新脚本
  2. 将上述代码粘贴到脚本编辑器
  3. 保存并运行脚本
  4. 点击"设置"按钮,输入格式如:10,20
  5. 点击"运行"按钮,查看 a 和 b 的值

注意事项

  • 输入值时使用逗号分隔,例如:5,10
  • 脚本使用 UI 模式,需要在支持 UI 的设备上运行
  • 代码兼容 Rhino 1.7.15 JavaScript 引擎,未使用箭头函数和默认参数

如果需要其他功能扩展,可以告诉我具体需求。


补充回答 1

Hamibot 悬浮窗设置脚本

以下是完整的悬浮窗脚本,包含两个悬浮按钮,点击设置弹出设置窗口,点击运行显示 a 和 b 的值:

// 文档地址 https://docs.hamibot.com/

// 全局变量存储 a 和 b 的值
var aValue = 0;
var bValue = 0;

// 创建主悬浮窗 - 两个按钮
var mainFloaty = floaty.window(
    <vertical>
        <button id="settingBtn" text="设置" w="80" h="40" bg="#4488ff" textColor="#ffffff"/>
        <button id="runBtn" text="运行" w="80" h="40" bg="#44cc44" textColor="#ffffff" margin="8 0 0 0"/>
    </vertical>
);

// 设置悬浮窗位置
mainFloaty.setPosition(100, 100);

// 设置变量标记设置窗口是否打开
var isSettingOpen = false;
var settingWindow = null;

// 设置按钮点击事件
mainFloaty.settingBtn.click(function() {
    if (isSettingOpen) {
        toast("设置窗口已打开");
        return;
    }
    
    isSettingOpen = true;
    
    // 创建设置悬浮窗
    settingWindow = floaty.window(
        <vertical padding="10" bg="#ffffff">
            <text text="设置参数" textSize="16sp" textStyle="bold" gravity="center"/>
            <linear margin="0 10 0 0">
                <text text="a:" w="40" gravity="center"/>
                <input id="inputA" text="0" inputType="number" w="100" h="40"/>
            </linear>
            <linear margin="0 10 0 0">
                <text text="b:" w="40" gravity="center"/>
                <input id="inputB" text="0" inputType="number" w="100" h="40"/>
            </linear>
            <linear margin="0 15 0 0" gravity="center">
                <button id="saveBtn" text="保存" w="60" h="35" bg="#4488ff" textColor="#ffffff"/>
                <button id="cancelBtn" text="取消" w="60" h="35" bg="#888888" textColor="#ffffff" margin="10 0 0 0"/>
            </linear>
        </vertical>
    );
    
    // 设置设置窗口位置
    settingWindow.setPosition(200, 200);
    
    // 保存按钮点击事件
    settingWindow.saveBtn.click(function() {
        var aText = settingWindow.inputA.getText();
        var bText = settingWindow.inputB.getText();
        
        aValue = parseInt(aText);
        bValue = parseInt(bText);
        
        if (isNaN(aValue)) aValue = 0;
        if (isNaN(bValue)) bValue = 0;
        
        toast("设置成功!a=" + aValue + ", b=" + bValue);
        
        // 关闭设置窗口
        settingWindow.close();
        settingWindow = null;
        isSettingOpen = false;
    });
    
    // 取消按钮点击事件
    settingWindow.cancelBtn.click(function() {
        settingWindow.close();
        settingWindow = null;
        isSettingOpen = false;
        toast("已取消设置");
    });
});

// 运行按钮点击事件
mainFloaty.runBtn.click(function() {
    toast("运行结果:a=" + aValue + ", b=" + bValue);
});

// 主悬浮窗关闭事件
mainFloaty.exitBtn.click(function() {
    if (settingWindow != null) {
        settingWindow.close();
    }
    hamibot.exit();
});

// 保持悬浮窗不被关闭
setInterval(function() {}, 1000);

功能说明

组件 功能
设置按钮 点击弹出设置窗口,可输入 a 和 b 的值
运行按钮 点击显示当前 a 和 b 的值
设置窗口 包含两个输入框,分别设置 a 和 b
保存按钮 保存设置并关闭设置窗口
取消按钮 取消设置并关闭设置窗口

使用步骤

  1. 在 Hamibot 控制台创建新脚本
  2. 将代码粘贴到脚本编辑器
  3. 保存并运行脚本
  4. 屏幕上会出现两个悬浮按钮
  5. 点击"设置"按钮,弹出设置窗口
  6. 输入 a 和 b 的值,点击"保存"
  7. 点击"运行"按钮,查看 a 和 b 的值

注意事项

  • 脚本需要悬浮窗权限才能正常运行
  • 悬浮窗在脚本停止运行时会自动关闭
  • 使用 setInterval 保持悬浮窗不被关闭
  • 代码兼容 Rhino 1.7.15 JavaScript 引擎
  • 输入值支持数字,非数字会自动转为 0

自定义调整

如果需要调整悬浮窗位置,修改以下代码:

mainFloaty.setPosition(100, 100);  // 主悬浮窗位置
settingWindow.setPosition(200, 200);  // 设置窗口位置

如果需要调整按钮大小,修改布局中的 w 和 h 参数。


补充回答 2

脚本闪退修复方案

脚本闪退通常是由于权限不足或代码兼容性问题。以下是修复后的稳定版本:

修复后的代码

// 文档地址 https://docs.hamibot.com/

// 请求必要的权限
auto.waitFor();

// 全局变量存储 a 和 b 的值
var aValue = 0;
var bValue = 0;

// 标记设置窗口是否打开
var isSettingOpen = false;
var settingWindow = null;

// 创建主悬浮窗 - 两个按钮
var mainFloaty = floaty.window(
    <vertical bg="#ffffff" padding="5">
        <button id="settingBtn" text="设置" w="70" h="35" bg="#4488ff" textColor="#ffffff"/>
        <button id="runBtn" text="运行" w="70" h="35" bg="#44cc44" textColor="#ffffff" margin="0 5 0 0"/>
    </vertical>
);

// 设置悬浮窗位置
mainFloaty.setPosition(100, 100);

// 设置按钮点击事件
mainFloaty.settingBtn.click(function() {
    if (isSettingOpen) {
        toast("设置窗口已打开");
        return;
    }
    
    isSettingOpen = true;
    
    // 创建设置悬浮窗
    settingWindow = floaty.window(
        <vertical padding="10" bg="#ffffff">
            <text text="设置参数" textSize="16sp" textStyle="bold" gravity="center"/>
            <linear margin="0 10 0 0">
                <text text="a:" w="30" gravity="center"/>
                <input id="inputA" text="0" inputType="number" w="80" h="35"/>
            </linear>
            <linear margin="0 10 0 0">
                <text text="b:" w="30" gravity="center"/>
                <input id="inputB" text="0" inputType="number" w="80" h="35"/>
            </linear>
            <linear margin="0 15 0 0" gravity="center">
                <button id="saveBtn" text="保存" w="50" h="30" bg="#4488ff" textColor="#ffffff"/>
                <button id="cancelBtn" text="取消" w="50" h="30" bg="#888888" textColor="#ffffff" margin="10 0 0 0"/>
            </linear>
        </vertical>
    );
    
    settingWindow.setPosition(200, 200);
    
    // 保存按钮点击事件
    settingWindow.saveBtn.click(function() {
        try {
            var aText = settingWindow.inputA.getText();
            var bText = settingWindow.inputB.getText();
            
            aValue = parseInt(aText);
            bValue = parseInt(bText);
            
            if (isNaN(aValue)) aValue = 0;
            if (isNaN(bValue)) bValue = 0;
            
            toast("设置成功!a=" + aValue + ", b=" + bValue);
        } catch (e) {
            toast("设置失败:" + e);
        } finally {
            if (settingWindow != null) {
                settingWindow.close();
            }
            settingWindow = null;
            isSettingOpen = false;
        }
    });
    
    // 取消按钮点击事件
    settingWindow.cancelBtn.click(function() {
        if (settingWindow != null) {
            settingWindow.close();
        }
        settingWindow = null;
        isSettingOpen = false;
        toast("已取消设置");
    });
});

// 运行按钮点击事件
mainFloaty.runBtn.click(function() {
    toast("运行结果:a=" + aValue + ", b=" + bValue);
});

// 保持悬浮窗不被关闭
setInterval(function() {}, 1000);

必须开启的权限

运行前请确保开启以下权限:

权限 开启方法
悬浮窗权限 设置 → 应用管理 → Hamibot → 权限 → 悬浮窗 → 允许
无障碍服务 设置 → 无障碍 → Hamibot → 开启
后台弹窗权限 设置 → 应用管理 → Hamibot → 权限 → 后台弹窗 → 允许

常见闪退原因及解决

问题 解决方法
无悬浮窗权限 在手机设置中开启悬浮窗权限
无障碍服务未开启 在无障碍设置中开启 Hamibot 服务
系统杀后台 将 Hamibot 加入白名单,允许后台运行
Android 版本过高 Android 10+ 需要额外授予"显示在其他应用上层"权限

调试方法

如果仍然闪退,可以:

  1. 打开 Hamibot App 右上角日志图标
  2. 运行脚本查看错误信息
  3. 截图反馈给脚本作者

简化版本(如果以上仍闪退)

// 文档地址 https://docs.hamibot.com/

var aValue = 0;
var bValue = 0;

toast("脚本已启动,a=" + aValue + ", b=" + bValue);

// 简单对话框方式
var input = dialogs.rawInput("设置 a 和 b 的值", "0,0");
var values = input.split(",");
aValue = parseInt(values[0]) || 0;
bValue = parseInt(values[1]) || 0;

toast("设置完成:a=" + aValue + ", b=" + bValue);
toast("运行结果:a=" + aValue + ", b=" + bValue);

这个简化版本不使用悬浮窗,更稳定。如果需要悬浮窗功能,请先确保权限全部开启。

ℹ️ 本回答由 AI 生成,内容仅供参考