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)
}
}
}