// 主动检测悬浮窗权限,没开就跳设置页
if (!floaty.checkPermission()) {
toast("正在跳转到悬浮窗权限设置页");
floaty.requestPermission();
sleep(2000);
// 强制声明系统级悬浮窗类型,适配Android10+
floaty.setWindowType("system_alert_window");
}

// 创建超大号悬浮窗,绝对不会看漏
let win = floaty.rawWindow(
<frame w="150dp" h="150dp" bg="#FF0000" gravity="center">
<text text="悬浮窗" textSize="20sp" color="#FFFFFF" gravity="center"/>
</frame>
);

// 固定在屏幕正中央,强制置顶
win.setGravity(Gravity.CENTER);
win.show();
toast("悬浮窗已显示在屏幕中央");

// 用前台定时器保活,防止系统杀进程
setInterval(() => {
win.bringToFront(); // 每秒强制置顶一次
}, 500);

HAMI_7684181272 · 5 小时前

回答

Hamibot AI
1
· 5 小时前

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

你的脚本整体思路正确,但在 Hamibot 环境中存在一些兼容性和 API 使用上的问题,以下是你代码中的关键点分析和修改建议:

问题说明

  1. floaty.setWindowType("system_alert_window"):Hamibot 不支持该方法。悬浮窗的窗口类型由系统自动管理,调用此方法会报错。
  2. win.setGravity(Gravity.CENTER)Gravity 未定义。你需要导入 Android 的 Gravity 类。
  3. w="150dp" 写法错误:XML 中应使用 width 而不是 w,同理 h 应为 height
  4. sleep(2000) 在非线程环境下可能导致阻塞,但在此上下文中可接受。
  5. setInterval(() => {}, 500) 使用了箭头函数,而 Hamibot 使用的是 Rhino 1.7.15 引擎,不支持 ES6 箭头函数。

✅ 修改后的可用版本(适配 Hamibot)

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

// 主动检测悬浮窗权限,没开就跳设置页
if (!floaty.checkPermission()) {
  toast("正在跳转到悬浮窗权限设置页");
  floaty.requestPermission();
  sleep(2000);
  // 注意:Hamibot 不支持 floaty.setWindowType,无需也不可设置
}

// 创建超大号悬浮窗,绝对不会看漏
let win = floaty.rawWindow(
  <frame width="150dp" height="150dp" bg="#FF0000" gravity="center">
    <text text="悬浮窗" textSize="20sp" color="#FFFFFF" gravity="center"/>
  </frame>
);

// 导入 Android Gravity 类用于 setGravity
const Gravity = android.view.Gravity;

// 固定在屏幕正中央,强制置顶
ui.run(function() {
  win.setGravity(Gravity.CENTER);
});
win.show();

toast("悬浮窗已显示在屏幕中央");

// 用定时器保活,防止被系统回收(使用普通函数,避免箭头函数)
setInterval(function() {
  ui.run(function() {
    win.bringToFront(); // 提升层级,确保置顶
  });
}, 500);

// 防止脚本退出关闭悬浮窗
setInterval(function() {}, 1000);

补充说明

  • floaty.rawWindow 创建原始悬浮窗,不会自带控制按钮,适合做全屏或固定样式悬浮窗。
  • ui.run() 是必须的,因为 setGravity() 等操作需要在 UI 线程执行。
  • 最后的空 setInterval 是保持脚本运行的关键,否则脚本结束会自动关闭悬浮窗。
  • 权限请求后不能立即创建:部分设备需手动返回应用,建议提示用户返回后再运行脚本。

建议优化

你可以增加权限等待循环,提升用户体验:

// 等待用户授权后再创建悬浮窗
while (!floaty.checkPermission()) {
  toast("请先授予悬浮窗权限");
  floaty.requestPermission();
  sleep(2000);
}
// 授权通过后继续执行创建逻辑

这样可以确保权限到位后再显示悬浮窗。

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