You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Espruino中如何根据按键/触摸长按时长触发不同动作?

根据按住时长触发不同动作的实现方案

针对按键和触摸两种场景,我们需要分别记录按下/触摸开始的时间戳,在松开/触摸结束时计算按住时长,再根据预设的时长区间执行对应动作。以下是具体实现:

一、按键(BTN1)的处理

原来的setWatch只监听了松开动作,现在需要拆分按下和松开两个阶段:

let btnPressStartTime;

// 监听按键按下(下降沿),记录开始时间
setWatch(() => {
  btnPressStartTime = Date.now(); // 记录当前时间戳(毫秒)
}, BTN1, { edge: "falling", repeat: true });

// 监听按键松开(上升沿),计算时长并执行对应动作
setWatch(() => {
  if (!btnPressStartTime) return; // 防止异常情况
  const pressDuration = Date.now() - btnPressStartTime;
  btnPressStartTime = null; // 重置时间

  // 定义时长区间,触发不同动作
  if (pressDuration < 500) {
    f_ActionShortPress(); // 短按(<500ms)动作
  } else if (pressDuration >= 500 && pressDuration < 2000) {
    f_ActionMediumPress(); // 中长按(500ms-2s)动作
  } else {
    f_ActionLongPress(); // 长按(>=2s)动作
  }
}, BTN1, { edge: "rising", repeat: true });

二、屏幕触摸(触摸区域1)的处理

Bangle.js的touch事件会在触摸开始(down)和结束(up)时触发,我们需要区分状态并记录时间:

let touchStartTime;

Bangle.on('touch', function(touchData) {
  // 对应原代码中触摸区域1的判断逻辑
  const isTouchArea1 = touchData.button === 1;

  if (touchData.type === 'down' && isTouchArea1) {
    touchStartTime = Date.now(); // 触摸开始时记录时间
  } else if (touchData.type === 'up' && isTouchArea1) {
    if (!touchStartTime) return;
    const touchDuration = Date.now() - touchStartTime;
    touchStartTime = null; // 重置时间

    // 按时长区间执行动作
    if (touchDuration < 500) {
      f_ActionShortTouch(); // 短触摸动作
    } else if (touchDuration >= 500 && touchDuration < 2000) {
      f_ActionMediumTouch(); // 中长触摸动作
    } else {
      f_ActionLongTouch(); // 长触摸动作
    }
  }
});

关键说明

  • 时间戳使用Date.now()获取,单位为毫秒,方便计算时长。
  • 可根据需求自定义时长区间(比如把短按设为<300ms,长按设为>=1500ms)。
  • 每次处理完动作后要重置开始时间,避免下次触发时使用旧值。
  • 当前实现完全贴合“松开后触发动作”的需求,无需额外处理长按期间的持续触发逻辑。

内容的提问来源于stack exchange,提问作者Daniel Perez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 17:39:24