floaty.window 上的按钮 如何控制另一个floaty.window显示与隐藏
以上方法中,targetWindow.hide()方法无效果,编辑器编辑不过
floaty.window 里边的定义的按钮文字 如何动态设置
回答
文档地址 https://docs.hamibot.com/
你可以通过在按钮的点击事件中调用目标 floaty.window
的 show()
或 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,避免崩溃或异常行为。