如何解决拖动手势时获取屏幕位置为空的问题
====================

#### 问题现象

在实现滑动手势PanGesture时，使用双指操作（做缩放捏合动作，没有添加捏合手势），会造成异常闪退。闪退日志：

Cannot read property displayX of undefined。

问题代码示例参考如下：

@Entry
@Component
struct GetScreen {
  @State touchX: number \= 0;
  @State touchY: number \= 0;

  build() {
    Column() {
      Column() {
      }
      .width(300)
      .height(500)
      .border({ width: 0.5, color: '#000' })
      .gesture(
        PanGesture()
          .onActionStart((event: GestureEvent | undefined) \=\> {
            if (event && event.fingerList.length \> 0) {
              this.touchX \= event.fingerList\[0\].displayX
              this.touchY \= event.fingerList\[0\].displayY
              console.info(\`fingerList: ${JSON.stringify(event.fingerList\[0\])}\`)
          _    // ..._
            }
          })
          .onActionUpdate((event?: GestureEvent | undefined) \=\> {
            if (event && event.fingerList.length \> 0) {
              this.touchX \= event.fingerList\[0\].displayX
              this.touchY \= event.fingerList\[0\].displayY
              console.info(\`fingerList: ${JSON.stringify(event.fingerList\[0\])}\`)
           _   // ..._
            }
          })
      )
    }
    .height('100%')
    .width('100%')
    .padding(24)
  }
}

问题效果预览：

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/2d/v3/LF5cY3tiS6Cnbl7m7Cg_Sw/zh-cn_image_0000002658914681.gif?HW-CC-KV=V1&HW-CC-Date=20260709T133915Z&HW-CC-Expire=86400&HW-CC-Sign=23E06FF51B22D2E8D86787F348CECAADF5A07472756CEA7A13ED021766E3F09A "点击放大")

#### 效果预览

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/0/v3/uFuJjYKCRlyMnY-cYLtuAQ/zh-cn_image_0000002658794731.gif?HW-CC-KV=V1&HW-CC-Date=20260709T133915Z&HW-CC-Expire=86400&HW-CC-Sign=E4C4798334CAE4F84FAB319C39EDDCEFCF9F755B6F78FE6ACB5CC0267F5C0560 "点击放大")

#### 背景知识

*   [滑动手势](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-basic-gestures-pangesture)用于触发拖动手势事件，滑动达到最小滑动距离（默认值为5vp）时拖动手势识别成功。
*   事件参数[GestureEvent](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-gesture-common#gestureevent对象说明)对象中fingerList中会包含触发事件的所有触点信息。

#### 问题定位

根据报错信息：

Cannot read property displayX of undefined

可知event.fingerList\[0\]上没有displayX属性。

#### 分析结论

fingerList\[0\]会存在值为空的情况。比如两个手指操作的场景，第1、2个手指按下，后面第1个手指先抬起，这时fingerList\[0\]的值为空。

#### 修改建议

处理时加一个判断条件，在fingerList\[0\]有值的情况下获取其属性。

@Entry
@Component
struct GetScreen {
  @State touchX: number \= 0;
  @State touchY: number \= 0;

  build() {
    Column() {
      Column() {
      }
      .width(300)
      .height(500)
      .border({ width: 0.5, color: '#000' })
      .gesture(
        PanGesture()
          .onActionStart((event: GestureEvent | undefined) \=\> {
        _    // 当event.fingerList\[0\]有值时，再去获取屏幕位置_
            if (event && event.fingerList.length \> 0 && event.fingerList\[0\]) {
              this.touchX \= event.fingerList\[0\].displayX;
              this.touchY \= event.fingerList\[0\].displayY;
              console.info(\`fingerList: ${event.fingerList\[0\]}\`);
          _    // ..._
            }
          })
          .onActionUpdate((event?: GestureEvent | undefined) \=\> {
         _   // 当event.fingerList\[0\]有值时，再去获取屏幕位置_
            if (event && event.fingerList.length \> 0 && event.fingerList\[0\]) {
              this.touchX \= event.fingerList\[0\].displayX;
              this.touchY \= event.fingerList\[0\].displayY;
              console.info(\`fingerList: ${JSON.stringify(event.fingerList\[0\])}\`);
          _    // ..._
            }
          })
      );
    }
    .height('100%')
    .width('100%')
    .padding(24);
  }
}