floaty.window frame setVisibility 默认设置不可见
如何控制 console.show() 显示 与关闭
w.logbtn.click(function(){
if(logWinShow){
console.hide();
}else{
console.show();
}
logWinShow = !logWinShow
})
以上当第二次点击按钮 hamibot就会卡死,问题出在哪
回答
要设置 floaty.window
中 frame
的默认可见性为不可见,可以在 XML 布局中使用 visibility
属性,将其值设为 gone
:
<frame
visibility="gone"
gravity="center"
bg="#FF0000">
<text>初始不可见的内容</text>
</frame>
说明:
-
visibility="gone"
:此属性会直接隐藏frame
,且不会占用任何布局空间。如果需要隐藏后保留占位空间,使用invisible
。 -
动态修改时需在 UI 线程操作(如
ui.run
):ui.run(() => { w.frame.setVisibility(android.view.View.VISIBLE); // 显示 });
完整示例:
var w = floaty.window(
<frame visibility="gone" gravity="center" bg="#FF0000">
<text>初始不可见</text>
</frame>
);
// 5秒后显示
setTimeout(() => {
ui.run(() => {
w.frame.setVisibility(android.view.View.VISIBLE);
});
}, 5000);
// 10秒后关闭
setTimeout(() => w.close(), 10000);
补充回答 1
使用 console.show()
和 console.hide()
可直接控制悬浮窗的显示与关闭。以下为具体实现:
1. 基本用法
- 显示控制台
调用console.show()
显示悬浮窗(需悬浮窗权限)。 - 关闭控制台
调用console.hide()
隐藏悬浮窗,或通过console.clear()
清空内容并隐藏。
console.show(); // 显示悬浮窗
console.log("Hello, World!"); // 输出日志
// 3秒后自动隐藏
setTimeout(console.hide, 3000);
2. 交互式控制
通过悬浮按钮动态切换显示/关闭状态:
// 创建显示/隐藏按钮
var btn = floaty.button("切换控制台");
btn.click(() => {
if (btn.text() === "显示") {
console.show();
btn.setText("隐藏");
} else {
console.hide();
btn.setText("显示");
}
});
3. 权限与注意事项
- 悬浮窗权限:若首次运行未弹出悬浮窗,需手动在系统设置中为 Hamibot 开启悬浮窗权限。
- 自动隐藏:Hamibot 1.6.0+ 版本会在脚本结束时自动调用
console.hide()
,无需手动处理。
4. 进阶场景
- 定时输出并隐藏:
结合setInterval
定时输出日志,并在特定条件后隐藏。
console.show();
let count = 0;
let timer = setInterval(() => {
console.log(`计数: ${count}`);
if (++count >= 5) {
clearInterval(timer);
console.hide();
}
}, 1000);
通过上述方法可灵活管理控制台悬浮窗的显示状态,结合实际需求调整逻辑即可。
补充回答 2
根据你的代码逻辑,第二次点击按钮时 Hamibot 卡死的根本原因在于 console.hide()
未在 UI 线程中执行,导致跨线程操作冲突。以下是问题分析和解决方案:
🔍 问题核心原因
Hamibot 的 console.show()
和 console.hide()
本质上是 UI 操作,必须 在 UI 线程中执行。如果你直接在点击事件回调中调用这些函数(未使用 ui.run()
),可能会导致以下后果:
- 线程阻塞:UI 操作未在主线程执行,引发界面冻结。
- 状态不一致:
console.hide()
可能因 UI 状态未同步而失败,进而卡死脚本。
✅ 修复方案
将 console.show()
和 console.hide()
封装在 ui.run()
中,确保它们在 UI 线程中执行:
var logWinShow = false; // 确保变量已正确初始化
w.logbtn.click(function () {
if (logWinShow) {
ui.run(function () {
console.hide(); // 在 UI 线程中隐藏
});
} else {
ui.run(function () {
console.show(); // 在 UI 线程中显示
});
}
logWinShow = !logWinShow;
});
🧪 验证步骤
- 初始化状态:确认
logWinShow
已正确声明并初始化为false
。 - 跨线程测试:多次点击按钮,观察控制台能否正常切换显示/隐藏。
- 异常捕获(可选):为防止偶发错误,可添加
try...catch
:
w.logbtn.click(function () {
if (logWinShow) {
ui.run(function () {
try {
console.hide();
} catch (e) {
toast("隐藏失败:" + e);
}
});
} else {
ui.run(function () {
try {
console.show();
} catch (e) {
toast("显示失败:" + e);
}
});
}
logWinShow = !logWinShow;
});
⚠️ 其他注意事项
- 悬浮窗权限:确保 Hamibot 已获得悬浮窗权限(系统设置 > 应用管理 > Hamibot > 权限)。
- 版本兼容性:Hamibot 1.6.0+ 对
console
的行为进行了优化,建议使用最新版本。 - 避免重复调用:如果按钮被连续快速点击,可能导致
console.show()
或hide()
被多次调用。可通过添加防抖逻辑缓解:
var lock = false; // 添加锁机制
w.logbtn.click(function () {
if (lock) return;
lock = true;
if (logWinShow) {
ui.run(function () {
console.hide();
lock = false;
});
} else {
ui.run(function () {
console.show();
lock = false;
});
}
logWinShow = !logWinShow;
});
📚 相关文档参考
floaty.window
和ui.run()
的使用详见:https://docs.hamibot.com/reference/uiconsole.show()
和console.hide()
的行为说明:https://docs.hamibot.com/reference/console
通过以上修改,你的脚本应能正常切换控制台显示状态,且不会在第二次点击时卡死。