onTouch: function(view, event) event.getAction()获得的试数值索引而并非具体字符串,
event.getX(),移动窗口这长按 这个值为什么会很大,导致窗口抖动
回答
在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()
返回的是相对于当前视图的坐标(非屏幕绝对坐标),若直接用于移动悬浮窗,可能导致数值异常或抖动。以下是原因及解决方法:
原因分析
-
坐标系差异
event.getX()
的值是基于视图内部的相对坐标,而悬浮窗的位置需要基于屏幕绝对坐标。若直接用此值设置窗口位置(如window.setPosition(event.getX(), ...)
),可能因视图尺寸或缩放导致数值过大。 -
未处理触摸事件的位移逻辑
若直接用event.getX()
作为窗口的 X 坐标,而非计算触摸移动的偏移量,会导致窗口位置频繁剧烈变化(尤其在长按拖动时)。 -
屏幕密度或缩放问题
在高分辨率设备上,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)
打印事件对象,确认坐标值是否符合预期。
通过以上调整,可有效解决因坐标值过大导致的窗口抖动问题。