onTouch: function(view, event) event.getAction()获得的试数值索引而并非具体字符串,

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

event.getX(),移动窗口这长按 这个值为什么会很大,导致窗口抖动

回答

Hamibot AI
1
· 1 个月前

在Hamibot中,event.getAction()返回的是系统定义的动作常量数值(如KeyEvent.ACTION_DOWN对应0,KeyEvent.ACTION_UP对应1),而非直接返回字符串。这是Android系统事件处理的常规设计,数值对应关系由系统底层定义。

若需获取具体动作字符串,可通过判断数值进行映射:

events.onTouch(function(p) {
    let action = event.getAction();
    if (action === 0) {
        log("触摸按下");
    } else if (action === 1) {
        log("触摸抬起");
    }
});

建议查阅Hamibot官方API文档或通过print(event)打印完整对象,确认具体数值对应的常量名称。若需更详细的事件类型解析,可结合event.getEventType()等方法辅助判断。


补充回答 1

在Hamibot中,event.getX()返回的是相对于当前视图的坐标(非屏幕绝对坐标),若直接用于移动悬浮窗,可能导致数值异常或抖动。以下是原因及解决方法:


原因分析

  1. 坐标系差异
    event.getX() 的值是基于视图内部的相对坐标,而悬浮窗的位置需要基于屏幕绝对坐标。若直接用此值设置窗口位置(如 window.setPosition(event.getX(), ...)),可能因视图尺寸或缩放导致数值过大。

  2. 未处理触摸事件的位移逻辑
    若直接用 event.getX() 作为窗口的 X 坐标,而非计算触摸移动的偏移量,会导致窗口位置频繁剧烈变化(尤其在长按拖动时)。

  3. 屏幕密度或缩放问题
    在高分辨率设备上,event.getX() 的值可能因系统缩放而放大,导致窗口位置计算不准确。


解决方法

1. 使用 event.getRawX() 获取屏幕绝对坐标

events.onTouch(function(event) {
    let rawX = event.getRawX(); // 获取屏幕绝对坐标
    let rawY = event.getRawY();
    // 设置悬浮窗位置
    window.setPosition(rawX, rawY);
});

2. 优化拖动逻辑(推荐)

通过记录触摸起始点,计算位移量更新窗口位置,避免直接使用绝对坐标:

let offsetX = 0, offsetY = 0;
events.onTouch(function(event) {
    switch (event.getAction()) {
        case "ACTION_DOWN":
            // 记录触摸点相对于窗口的位置
            offsetX = event.getRawX() - window.getX();
            offsetY = event.getRawY() - window.getY();
            break;
        case "ACTION_MOVE":
            // 根据位移量更新窗口位置
            window.setPosition(event.getRawX() - offsetX, event.getRawY() - offsetY);
            break;
    }
});

3. 避免频繁重绘

若窗口抖动是因频繁调用 setPosition(),可添加防抖逻辑或限制更新频率:

let lastTime = 0;
events.onTouch(function(event) {
    let now = new Date().getTime();
    if (now - lastTime > 16) { // 限制为约60fps
        window.setPosition(event.getRawX(), event.getRawY());
        lastTime = now;
    }
});

注意事项

  • 悬浮窗尺寸:确保窗口尺寸合理,避免因尺寸过大导致坐标计算偏差。
  • 权限检查:确保已开启无障碍服务和悬浮窗权限,否则可能影响事件监听。
  • 调试工具:通过 log(event) 打印事件对象,确认坐标值是否符合预期。

通过以上调整,可有效解决因坐标值过大导致的窗口抖动问题。

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