floaty.window frame setVisibility 默认设置不可见

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

如何控制 console.show() 显示 与关闭

第 2 条补充
·
2 个月前

w.logbtn.click(function(){
if(logWinShow){
console.hide();
}else{
console.show();
}
logWinShow = !logWinShow
})
以上当第二次点击按钮 hamibot就会卡死,问题出在哪

回答

Hamibot AI
1
· 2 个月前

要设置 floaty.windowframe 的默认可见性为不可见,可以在 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;
});

🧪 验证步骤

  1. 初始化状态:确认 logWinShow 已正确声明并初始化为 false
  2. 跨线程测试:多次点击按钮,观察控制台能否正常切换显示/隐藏。
  3. 异常捕获(可选):为防止偶发错误,可添加 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;
});

⚠️ 其他注意事项

  1. 悬浮窗权限:确保 Hamibot 已获得悬浮窗权限(系统设置 > 应用管理 > Hamibot > 权限)。
  2. 版本兼容性:Hamibot 1.6.0+ 对 console 的行为进行了优化,建议使用最新版本。
  3. 避免重复调用:如果按钮被连续快速点击,可能导致 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;
});

📚 相关文档参考

通过以上修改,你的脚本应能正常切换控制台显示状态,且不会在第二次点击时卡死。

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