HarmonyOS鸿蒙Next中onTouch事件在点击的时候,一直会触发TouchType的Move状态

HarmonyOS鸿蒙Next中onTouch事件在点击的时候,一直会触发TouchType的Move状态

.onTouch((event) => {
  switch (event.type) {
    case TouchType.Down:
      console.log('按下')
      break
    case TouchType.Move:
      console.log('移动' + event.touches[0].x + ',' + event.touches[0].y)
      break
  }
})

在按下去的瞬间,Down状态被触发后Move状态也接着被触发,即使手指不移动也会一直触发Move状态,Move连续打印出来的x、y值一模一样。

在模拟器上,TouchType的表现正常,不移动不触发,在真机上只要点击就会触发。

所以这是鸿蒙的“特性”?


更多关于HarmonyOS鸿蒙Next中onTouch事件在点击的时候,一直会触发TouchType的Move状态的实战教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

ios、android也是这样的

更多关于HarmonyOS鸿蒙Next中onTouch事件在点击的时候,一直会触发TouchType的Move状态的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


我这边试了,也是这样的,点一下触发好几个 Move, 而且只要一直按着就会一直触发 Move,即使你没有移动你的手指它也会一直触发。

建议增加防抖/节流限制触发频率

throttleMove: boolean = false

// ...

if (!this.throttleMove) {
  this.throttleMove = true;
  setTimeout(() => {
    switch (event.type) {
      case TouchType.Down:
        console.log('按下');
        break;
      case TouchType.Move:
        console.log('移动' + event.touches[0].x + ',' + event.touches[0].y);
        break;
    }
    this.throttleMove = false;
  }, 300); // 节流间隔时间设为300毫秒
}

在HarmonyOS鸿蒙Next中,onTouch事件频繁触发TouchType.Move状态是正常行为。触摸屏的高灵敏度会导致微小移动就被识别为Move事件。系统采样精度高,即使手指轻微抖动也会触发Move。若需区分点击和滑动,可通过判断移动距离阈值实现。官方API设计中,Move事件会持续上报坐标变化。

这是HarmonyOS Next中触控事件处理的正常行为。在真机环境下,即使用户手指没有明显移动,系统也会持续上报微小的坐标变化(即使x/y值相同),因此会触发Move事件。这种设计主要是为了:

  1. 更精确地处理触控操作,捕捉细微移动
  2. 保持与Android/iOS触控事件处理机制的一致性
  3. 为需要高精度触控的应用(如绘图类)提供更流畅的体验

建议解决方案:

  1. 如果需要区分真实移动和静止状态,可以记录上一次坐标并与当前坐标比较:
let lastX = 0, lastY = 0;
.onTouch((event) => {
  if(event.type === TouchType.Move) {
    if(event.touches[0].x !== lastX || event.touches[0].y !== lastY) {
      console.log('真实移动');
      lastX = event.touches[0].x;
      lastY = event.touches[0].y;
    }
  }
})
  1. 或者添加一个移动阈值判断:
const MOVE_THRESHOLD = 2; // 像素阈值
let startX = 0, startY = 0;
.onTouch((event) => {
  switch(event.type) {
    case TouchType.Down:
      startX = event.touches[0].x;
      startY = event.touches[0].y;
      break;
    case TouchType.Move:
      if(Math.abs(event.touches[0].x - startX) > MOVE_THRESHOLD || 
         Math.abs(event.touches[0].y - startY) > MOVE_THRESHOLD) {
        console.log('有效移动');
      }
      break;
  }
})
回到顶部