window.btnToggle.setOnTouchListener(callback)
我希望再某些条件下移除这个事件 后续又在某些条件下 新增这个事件

我日你妈PPMT · 11 小时前

回答

Hamibot AI
1
· 11 小时前

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

你可以通过保存对回调函数的引用来实现后续移除和重新添加触摸事件监听器。在 Hamibot 中,setOnTouchListener 绑定的事件可以通过传入 null 或使用对应的方法来移除,但更可靠的方式是使用 events 模块进行触摸事件的监听与管理。

不过如果你希望继续使用 window.btnToggle.setOnTouchListener 的方式,并且需要动态地移除和添加,可以参考如下做法:

// 定义你的触摸回调函数(不要使用内联函数,以便后续可以移除)
var touchCallback = function (down, x, y) {
    if (down) {
        log("按下: " + x + ", " + y);
        // 你的逻辑
    } else {
        log("抬起: " + x + ", " + y);
    }
    // 返回 true 表示消费该事件,防止传递下去
    return true;
};

// 设置监听
window.btnToggle.setOnTouchListener(touchCallback);

// 在某些条件下移除监听
if (someCondition) {
    window.btnToggle.setOnTouchListener(null);
}

// 在某些条件下重新添加监听
if (anotherCondition) {
    window.btnToggle.setOnTouchListener(touchCallback);
}

注意事项:

  • setOnTouchListener 是控件级别的方法,它不被统一的事件系统(如 events)管理,因此无法通过 events.removeListener 来移除。
  • 必须保留对原始 touchCallback 函数的引用才能正确“移除”或“重新添加”,因为 JavaScript 中函数是对象,只有引用一致才算同一个监听器。
  • 将监听器设为 null 即可移除当前的触摸监听。

推荐替代方案:使用 events.observeTouch()events.onTouch()

如果不需要绑定到具体按钮,而是全局监听触摸,推荐使用更灵活的 events 模块:

// 启用触摸事件监听
events.observeTouch();

// 存储监听器引用,便于移除
var touchListener = function (point) {
    log("触摸点: " + point.x + ", " + point.y);

    // 可在此判断坐标是否落在 btnToggle 区域内,模拟按钮行为
    var bounds = window.btnToggle.bounds();
    if (point.x >= bounds.left && point.x <= bounds.right &&
        point.y >= bounds.top && point.y <= bounds.bottom) {
        // 触摸在按钮区域内
        log("点击了按钮");
    }
};

// 添加监听
events.onTouch(touchListener);

// 移除监听
if (someCondition) {
    events.removeListener('touch', touchListener);
}

// 重新添加
if (anotherCondition) {
    events.onTouch(touchListener);
}

这种方式更适合需要动态控制事件生命周期的场景。

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