在HarmonyOS NEXT开发中基础手势单击和双击,如何只是识别双击而不识别单击?

阅读 587
avatarAI BotBETA
在HarmonyOS NEXT开发中,为了只识别双击而不识别单击,你可以通过设置一个计时器(如延迟处理)来实现。具体步骤如下:

1. **监听手势事件**:首先,你需要为控件添加手势监听器来捕获单击和双击事件。

2. **记录时间戳**:在每次单击事件发生时,记录当前的时间戳。

3. **比较时间间隔**:当再次捕获到单击事件时,比较当前时间戳与上一次单击事件的时间戳。如果时间间隔小于某个阈值(比如300毫秒),则认为这是一个双击事件。

4. **忽略单次点击**:如果识别为双击,则忽略之前的单次点击事件。如果时间间隔超过阈值,则视为正常的单击事件。

5. **重置时间戳**:在识别到双击或确定是一次单独的单击事件后,重置时间戳记录。

以下是一个简单的伪代码示例,展示了上述逻辑的实现:

long lastClickTime = 0;
static final long DOUBLE_CLICK_TIME_THRESHOLD = 300; // 300毫秒

@Override
public boolean onTouchEvent(MotionEvent event) {

long currentTime = System.currentTimeMillis();

if (event.getAction() == MotionEvent.ACTION_DOWN) {
    if (currentTime - lastClickTime < DOUBLE_CLICK_TIME_THRESHOLD) {
        // 识别为双击事件
        handleDoubleClick();
    } else {
        // 忽略单击事件(或者你也可以在这里处理单击事件,但知道这不是双击的一部分)
        // handleSingleClick(); // 如果需要处理单击,请取消注释
    }
    // 重置时间戳
    lastClickTime = currentTime;
}

return true;

}

private void handleDoubleClick() {

// 处理双击事件的逻辑

}


通过上述方法,你可以有效地识别双击事件并忽略单独的单击事件。
1 个回答

你可以使用组合手势GestureGroup的互斥识别模式。具体可参考文档: https://developer.huawei.com/consumer/cn/doc/harmonyos-refere...
分辨单击和双击的示例代码(需要注意,双击事件需放在单击事件前面,互斥识别是按排列顺序来识别,如果单击事件放前面则只会识别到单击事件)

// xxx.ets 
@Entry 
@Component 
struct TapGestureExample { 
  build() { 
    Column() { 
      Text('Click twice').fontSize(28) 
        .gesture(GestureGroup(GestureMode.Exclusive, 
          TapGesture({ count: 2 }) 
            .onAction((event?: GestureEvent) => { 
              console.log('TapGesture 2') 
            }), 
          TapGesture({ count: 1 }) 
            .onAction((event?: GestureEvent) => { 
              console.log('TapGesture 1') 
            }) 
        ) 
        ) 
    } 
  } 
}

本文参与了 【 HarmonyOS NEXT 技术问答冲榜,等你来战!】欢迎正在阅读的你也加入。