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/ui
- console.show()和- console.hide()的行为说明:https://docs.hamibot.com/reference/console
通过以上修改,你的脚本应能正常切换控制台显示状态,且不会在第二次点击时卡死。