floaty.window 上的按钮 如何控制另一个floaty.window显示与隐藏

已存档
兔如花
9
· 2 个月前
第 1 条补充
·
2 个月前

以上方法中,targetWindow.hide()方法无效果,编辑器编辑不过

第 2 条补充
·
2 个月前

floaty.window 里边的定义的按钮文字 如何动态设置

回答

Hamibot AI
1
· 2 个月前

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

你可以通过在按钮的点击事件中调用目标 floaty.windowshow()hide() 方法来控制其显示或隐藏。下面是一个完整的示例代码:

// 创建第一个悬浮窗(控制按钮)
var controlWindow = floaty.window(
    <vertical padding="10">
        <button id="showBtn" text="显示窗口" />
        <button id="hideBtn" text="隐藏窗口" />
    </vertical>
);

// 创建第二个悬浮窗(被控制的窗口)
var targetWindow = floaty.window(
    <frame gravity="center" bg="#FF00FF">
        <text id="msg">这是一个可控制显示/隐藏的悬浮窗</text>
    </frame>
);

// 按钮点击事件监听
controlWindow.showBtn.click(function () {
    targetWindow.show(); // 显示目标悬浮窗
});

controlWindow.hideBtn.click(function () {
    targetWindow.hide(); // 隐藏目标悬浮窗
});

// 设置目标窗口初始为隐藏状态(可选)
targetWindow.hide();

// 保持脚本运行,防止退出
setInterval(function () {}, 1000);

说明:

  • controlWindow 是带有两个按钮的悬浮窗,用于控制另一个窗口的显示与隐藏。
  • targetWindow 是被控制的悬浮窗。
  • 使用 .show() 方法让悬浮窗显示,.hide() 方法让悬浮窗隐藏。

你可以在实际项目中根据需要扩展功能,例如添加动画、位置调整等。


补充回答 1

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

在 Hamibot 的 floaty.window 实例中,确实没有提供 .hide() 方法来隐藏悬浮窗。如果你调用 targetWindow.hide() 会出现“方法不存在”的错误。

要实现“隐藏”效果,可以通过设置悬浮窗的布局参数或透明度来间接实现。以下是两种替代方案:


✅ 方案一:通过修改透明度实现“隐藏”和“显示”

// 创建第二个悬浮窗(被控制的窗口)
var targetWindow = floaty.window(
    <frame gravity="center" bg="#FF00FF">
        <text id="msg">这是一个可控制显示/隐藏的悬浮窗</text>
    </frame>
);

// 初始状态设为完全透明(相当于隐藏)
ui.run(function () {
    targetWindow.getLayout().setAlpha(0); // 透明度为0,不可见
});

// 显示悬浮窗
function showTargetWindow() {
    ui.run(function () {
        targetWindow.getLayout().setAlpha(1); // 完全不透明
    });
}

// 隐藏悬浮窗(设置透明度为0)
function hideTargetWindow() {
    ui.run(function () {
        targetWindow.getLayout().setAlpha(0); // 完全透明
    });
}

你可以将上面的 showTargetWindow()hideTargetWindow() 函数绑定到按钮点击事件上。


✅ 方案二:通过移动悬浮窗到屏幕外实现“隐藏”

// 获取屏幕宽高
var deviceWidth = device.width;
var deviceHeight = device.height;

// 显示悬浮窗到屏幕中央
function showTargetWindow() {
    targetWindow.setPosition(deviceWidth / 2, deviceHeight / 2);
}

// 隐藏悬浮窗(移出屏幕范围)
function hideTargetWindow() {
    targetWindow.setPosition(-1000, -1000); // 移到屏幕外
}

这种方法适合需要频繁切换显示/隐藏的场景。


🔁 示例:完整带按钮的控制代码

// 创建控制按钮悬浮窗
var controlWindow = floaty.window(
    <vertical padding="10">
        <button id="showBtn" text="显示窗口" />
        <button id="hideBtn" text="隐藏窗口" />
    </vertical>
);

// 创建目标悬浮窗
var targetWindow = floaty.window(
    <frame gravity="center" bg="#FF00FF">
        <text id="msg">这是一个可控制显示/隐藏的悬浮窗</text>
    </frame>
);

// 初始位置设置为屏幕之外,相当于隐藏
targetWindow.setPosition(-1000, -1000);

// 控制按钮点击事件
controlWindow.showBtn.click(function () {
    targetWindow.setPosition(device.width / 2, device.height / 2);
});

controlWindow.hideBtn.click(function () {
    targetWindow.setPosition(-1000, -1000);
});

// 保持脚本运行
setInterval(function () {}, 1000);

小结:

  • 不支持直接使用 hide(),但可以使用透明度移出屏幕方式模拟隐藏。
  • 所有 UI 操作应放在 ui.run() 中执行。
  • 推荐使用 setPosition 移出屏幕 的方式实现隐藏,简单且兼容性好。

如需进一步封装成函数或结合动画效果也可以继续扩展。


补充回答 2

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

floaty.window 中定义的按钮文字可以通过按钮控件的 setText() 方法进行动态设置。由于脚本线程不是 UI 线程,因此所有对 UI 控件的修改必须放在 ui.run() 中执行。


✅ 示例:动态修改按钮文字

// 创建悬浮窗
var window = floaty.window(
    <vertical padding="10">
        <button id="btn" text="原始文字" />
    </vertical>
);

// 动态修改按钮文字
ui.run(function () {
    window.btn.setText("新文字");
});

🔄 示例:定时切换按钮文字

var window = floaty.window(
    <vertical padding="10">
        <button id="btn" text="点击开始" />
    </vertical>
);

var isStart = true;

window.btn.click(function () {
    ui.run(function () {
        if (isStart) {
            window.btn.setText("点击暂停");
        } else {
            window.btn.setText("点击开始");
        }
        isStart = !isStart;
    });
});

⚠️ 注意事项:

  • 所有对 UI 的操作(如 setText(), setTextColor(), getBackground() 等)都必须在 ui.run() 中执行
  • 不可在非 UI 线程直接访问或修改控件属性。
  • 如果你希望从其他函数中修改按钮文字,请确保仍然调用 ui.run()

📌 小结:

要动态设置 floaty.window 里按钮的文字内容,使用如下结构:

ui.run(function () {
    window.按钮ID.setText("新的文字");
});

这样可以保证在正确的线程中更新 UI,避免崩溃或异常行为。

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