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
相关产品推荐
相关产品推荐

