如何在长按手势回调方法里获取手指触摸点的坐标?

如何在长按手势回调方法里获取手指触摸点的坐标

阅读 294
avatarAI BotBETA

在Android开发中,如果你想在长按手势(LongPress Gesture)的回调方法里获取手指触摸点的坐标,你可以使用MotionEvent对象,该对象包含了触摸事件的信息。下面是一个简单的例子,展示了如何在onLongPress方法里获取触摸点的坐标:

// 假设你有一个View,并且你已经为它设置了一个长按监听器
final View myView = findViewById(R.id.my_view);

myView.setOnLongClickListener(new View.OnLongClickListener() {
    @Override
    public boolean onLongClick(View v) {
        // 获取触摸点的坐标
        float x = v.getX() + v.getWidth() / 2;
        float y = v.getY() + v.getHeight() / 2;

        // 打印坐标
        Log.d("LongPress", "X: " + x + ", Y: " + y);

        return true; // 表示长按事件已被处理
    }
});

在这个例子中,v.getX()v.getY()返回的是View的中心点坐标。如果你需要获取触摸点的原始坐标,你需要使用MotionEvent对象。你可以通过覆盖onTouchEvent方法并在其中处理长按事件来实现这一点:

@Override
public boolean onTouchEvent(MotionEvent event) {
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            // 记录按下时的时间
            downTime = SystemClock.uptimeMillis();
            break;
        case MotionEvent.ACTION_UP:
            // 计算按下和抬起之间的时间
            long duration = SystemClock.uptimeMillis() - downTime;
            if (duration > LONG_PRESS_THRESHOLD) { // LONG_PRESS_THRESHOLD是一个常量,表示长按的阈值,通常是500毫秒
                // 获取触摸点的坐标
                float x = event.getX();
                float y = event.getY();

                // 打印坐标
                Log.d("LongPress", "X: " + x + ", Y: " + y);

                return true; // 表示触摸事件已被处理
            }
            break;
    }
    return super.onTouchEvent(event);
}

在这个例子中,event.getX()event.getY()返回的是触摸点的原始坐标。你可以根据需要在长按事件发生时执行其他操作。

1 个回答

使用组合手势的顺序识别,当长按手势事件结束后触发拖动手势事件。在手势回调方法里获取event(GestureEvent类型)的fingerList(FingerInfo类型),获取到localX和localY数值,表示相对于当前组件元素原始区域左上角的坐标地址。可参考如下代码:

import { promptAction } from '@kit.ArkUI'; 
 
@Entry 
@Component 
struct CombinedExample { 
  @State count: number = 0; 
  private touchAreaRight: number = 0; 
  private touchAreaBottom: number = 0; 
  @State positionX: number = 0; 
  @State positionY: number = 0; 
  @State gestureEventInfo: string = ''; 
 
  build() { 
    Column() { 
      Row() { 
        Column() { 
          Text('+') 
            .fontSize(28) 
            .position({ x: this.positionX, y: this.positionY }) 
        } 
        .height(200) 
        .width('100%') 
        .backgroundColor("#F1F3F5") 
        .onAreaChange((oldValue: Area, newValue: Area) => { 
          this.touchAreaRight = newValue.width as number; 
          this.touchAreaBottom = newValue.height as number; 
        }) 
        .gesture( 
          // 以下组合手势为顺序识别,当长按手势事件未正常触发时则不会触发拖动手势事件 
          GestureGroup(GestureMode.Sequence, 
            LongPressGesture({ repeat: true }) 
              .onAction((event: GestureEvent) => { 
                if (event.repeat) { 
                  this.count++; 
                } 
              }), 
            PanGesture() 
              .onActionStart(() => { 
                promptAction.showToast({ message: "Pan start", duration: 1000 }); 
              }) 
              .onActionUpdate((event: GestureEvent) => { 
                for (let i = 0; i < event.fingerList.length; i++) { 
                  if (event.fingerList[i] == undefined 
                    || event.fingerList[i].localX < 0 
                    || event.fingerList[i].localY < 0 
                    || event.fingerList[i].localX > this.touchAreaRight 
                    || event.fingerList[i].localY > this.touchAreaBottom) { 
                    return; 
                  } 
                  this.positionX = event.fingerList[i].localX; 
                  this.positionY = event.fingerList[i].localY; 
                } 
                this.gestureEventInfo = "sequence gesture\n" + "LongPress onAction" + this.count 
                  + "\nX:" + this.positionX + "\nY:" + this.positionY; 
              }) 
              .onActionEnd(() => { 
                promptAction.showToast({ message: "Pan end", duration: 1000 }); 
              }) 
          ) 
            .onCancel(() => { 
              promptAction.showToast({ message: "取消", duration: 1000 }); 
            }) 
        ) 
      } 
      .padding(12) 
      .borderRadius(24) 
      .backgroundColor(Color.White) 
 
      Text(this.gestureEventInfo) 
        .fontSize(18) 
        .width('100%') 
        .textAlign(TextAlign.Start) 
        .padding({ left: 18, top: 30 }) 
    } 
    .height('100%') 
    .width('100%') 
    .backgroundColor("#F1F3F5") 
  } 
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进