private handlePointerEvents()

in packages/core/src/events/synthetic-event-manager.ts [110:221]


  private handlePointerEvents(pointerEvents: NativePointerEvents) {
    for (const pointerId in pointerEvents) {

      const {
        pointermove,
        pointerdown,
        pointerup,
        pointerleave,
      } = pointerEvents[pointerId]

      const { primaryPointerState } = this
      if (pointerleave) {
        const lastPath = primaryPointerState.path
        // 当 pointerleave 时不需要检测,清空 path 即可
        primaryPointerState.path = undefined
        const lastState = {
          path: lastPath,
          offset: primaryPointerState.offset,
          position: primaryPointerState.position,
        }
        if (lastPath) {
          this.dispatchEvent(this.createSyntheticPointerEvent(
            'pointerout',
            pointerleave,
            lastState,
          ))
          this.dispatchEventAtTarget(this.createSyntheticPointerEvent(
            'pointerleave',
            pointerleave,
            lastState,
          ))
        }
      }

      if (pointermove) {
        primaryPointerState.position = Point.fromXY(pointermove.offsetX, pointermove.offsetY)
        assert(this.rootNode)

        const lastPath = primaryPointerState.path

        const result = this.rootNode.hitTestFromRoot(primaryPointerState.position)
        primaryPointerState.path = result.path.map(it => it.target)
        primaryPointerState.offset = result.path[0].position
        const event = this.createSyntheticPointerEvent(
          'pointermove',
          pointermove,
          primaryPointerState,
        )
        this.dispatchEvent(event)

        // 处理 out 和 leave
        if (lastPath && lastPath[0] !== primaryPointerState.path[0]) {
          const lastState = {
            path: lastPath,
            offset: primaryPointerState.offset,
            position: primaryPointerState.position,
          }
          this.dispatchEvent(this.createSyntheticPointerEvent(
            'pointerout',
            pointermove,
            lastState,
          ))
          // todo(haocong): pointerleave 实现有误
          this.dispatchEventAtTarget(this.createSyntheticPointerEvent(
            'pointerleave',
            pointermove,
            lastState,
          ))
          this.dispatchEvent(this.createSyntheticPointerEvent(
            'pointerover',
            pointermove,
            primaryPointerState,
          ))
          this.dispatchEventAtTarget(this.createSyntheticPointerEvent(
            'pointerenter',
            pointermove,
            primaryPointerState,
          ))
        }
      }

      if (pointerdown) {
        primaryPointerState.isPointerDown = true
        primaryPointerState.position = Point.fromXY(pointerdown.offsetX, pointerdown.offsetY)
        assert(this.rootNode)
        const result = this.rootNode.hitTestFromRoot(primaryPointerState.position)
        primaryPointerState.path = result.path.map(it => it.target)
        primaryPointerState.offset = result.path[0].position
        const event = this.createSyntheticPointerEvent(
          'pointerdown',
          pointerdown,
          primaryPointerState,
        )
        this.dispatchEvent(event)
      }

      if (pointerup) {
        primaryPointerState.isPointerDown = false
        primaryPointerState.position = Point.fromXY(pointerup.offsetX, pointerup.offsetY)
        assert(this.rootNode)
        const result = this.rootNode.hitTestFromRoot(primaryPointerState.position)
        primaryPointerState.path = result.path.map(it => it.target)
        primaryPointerState.offset = result.path[0].position
        const event = this.createSyntheticPointerEvent(
          'pointerup',
          pointerup,
          primaryPointerState,
        )
        this.dispatchEvent(event)
      }
    }
  }