触摸事件
当用户用一个或多个触控点(如手指或触笔)触摸设备时,会触发触摸事件。触摸点的流程如下:
TOUCH_START
TOUCH_START_ACTIVATE
- 可选:
TOUCH_PRESS
- 可选:
TOUCH_DRAG
TOUCH_END
每次用户放下手指并抬起时,触摸顺序流程将始终遵循上述顺序。触摸事件并不与点击事件互斥。
其他可以单独出现的触摸事件是TOUCH_TAP
事件和TOUCH_SWIPE
事件。一个TOUCH_TAP
将触发一个TOUCH_START
-> TOUCH_END
事件流程。
如果用户连续点击,则只会触发一个TOUCH_TAP
事件,并记录用户点击的次数。
TOUCH_SWIPE
事件发生在用户在单个拖拽周期内在画布上移动超过48px
的情况下。此外,只有在触摸屏幕后200ms
内发生此移动时,TOUCH_SWIPE
才会激活。
如果用户对角移动,将同时触发LEFT
/RIGHT
和UP
/DOWN
滑动。
EVENT | 描述 |
---|---|
TOUCH_START | 当用户放下接触点时触发。 |
TOUCH_START_ACTIVATE | 只有在没有工具决定阻止TOUCH_START 事件的传播时才触发。它用于区分触摸现有注解和需要创建新注解。 |
TOUCH_PRESS | 如果用户放下触控点并在>700ms内没有移动,则触发。 |
TOUCH_DRAG | 任何时候用户移动接触点时触发,可能发生在TOUCH_PRESS 之前,因为TOUCH_PRESS 事件将容忍一些移动。 |
TOUCH_END | 当用户抬起一个或多个接触点时触发。 |
TOUCH_TAP | 当用户在300ms 内与屏幕接触并在TOUCH_START 后在画布上移动小于48px 时触发。 |
TOUCH_SWIPE | 当用户在单个拖动周期内移动超过48px 并在触摸屏幕后小于200ms 时触发。 |
多点触摸
触摸事件本身支持多点触摸,以ITouchPoints[]
提供。
为了使触摸事件与鼠标事件兼容,这些ITouchPoints[]
需要被简化为一个
ITouchPoint
。当前的数组简化策略是取平均坐标值。可以实现其他策略,如第一个点、中位数点等。这可以在
touch
utilities codebase实现。
ITouchPoints
的结构如下:
type ITouchPoints = {
/** 点的页面坐标 */
page: Types.Point2,
/** 点的客户端坐标 */
client: Types.Point2,
/** 点的画布坐标 */
canvas: Types.Point2,
/** 点的世界坐标 */
world: Types.Point3,
/** 原生触摸对象属性,这些属性是可JSON序列化的 */
touch: {
identifier: string,
radiusX: number,
radiusY: number,
force: number,
rotationAngle: number,
},
};
多点触摸拖拽计算
TOUCH_DRAG
事件具有以下结构:
type TouchDragEventDetail = NormalizedTouchEventDetail & {
/** 触摸事件的起始点。 */
startPoints: ITouchPoints,
/** 触摸的最后一点。 */
lastPoints: ITouchPoints,
/** 当前的触摸位置。 */
currentPoints: ITouchPoints,
startPointsList: ITouchPoints[],
/** 触摸的最后一点。 */
lastPointsList: ITouchPoints[],
/** 当前的触摸位置。 */
currentPointsList: ITouchPoints[],
/** 当前点和最后一点之间的差异。 */
deltaPoints: IPoints,
/** 当前点和最后一点之间的距离差异。 */
deltaDistance: IDistance,
};
deltaPoints
是lastPointsList
的平均坐标点与currentPointsList
之间的差异。
deltaDistance
是lastPointsList
与currentPointsList
中点之间平均距离的差异。