Skip to content

Commit d22f5ed

Browse files
authored
Change in handling coordinates in FlingGestureHandler (#2253)
## Description Right now `FlingGestureHandler` uses coordinates from event. Because of that, fling can activate after adding another pointer instead of moving the one that started gesture. This PR adds `keyPointer` field, which holds id of pointer that started fling. Handler now compares changes only in `keyPointer` position. ## Test plan Tested on example app
1 parent fb7824b commit d22f5ed

File tree

1 file changed

+26
-17
lines changed

1 file changed

+26
-17
lines changed

src/web/handlers/FlingGestureHandler.ts

Lines changed: 26 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ export default class FlingGestureHandler extends GestureHandler {
2121
private startY = 0;
2222

2323
private maxNumberOfPointersSimultaneously = 0;
24+
private keyPointer = NaN;
2425

2526
public init(ref: number, propsRef: React.RefObject<unknown>): void {
2627
super.init(ref, propsRef);
@@ -51,9 +52,9 @@ export default class FlingGestureHandler extends GestureHandler {
5152
};
5253
}
5354

54-
private startFling(event: AdaptedEvent): void {
55-
this.startX = event.x;
56-
this.startY = event.y;
55+
private startFling(): void {
56+
this.startX = this.tracker.getLastX(this.keyPointer);
57+
this.startY = this.tracker.getLastY(this.keyPointer);
5758

5859
this.begin();
5960

@@ -62,18 +63,22 @@ export default class FlingGestureHandler extends GestureHandler {
6263
this.delayTimeout = setTimeout(() => this.fail(), this.maxDurationMs);
6364
}
6465

65-
private tryEndFling(event: AdaptedEvent): boolean {
66+
private tryEndFling(): boolean {
6667
if (
6768
this.maxNumberOfPointersSimultaneously ===
6869
this.numberOfPointersRequired &&
6970
((this.direction & Direction.RIGHT &&
70-
event.x - this.startX > this.minAcceptableDelta) ||
71+
this.tracker.getLastX(this.keyPointer) - this.startX >
72+
this.minAcceptableDelta) ||
7173
(this.direction & Direction.LEFT &&
72-
this.startX - event.x > this.minAcceptableDelta) ||
74+
this.startX - this.tracker.getLastX(this.keyPointer) >
75+
this.minAcceptableDelta) ||
7376
(this.direction & Direction.UP &&
74-
this.startY - event.y > this.minAcceptableDelta) ||
77+
this.startY - this.tracker.getLastY(this.keyPointer) >
78+
this.minAcceptableDelta) ||
7579
(this.direction & Direction.DOWN &&
76-
event.y - this.startY > this.minAcceptableDelta))
80+
this.tracker.getLastY(this.keyPointer) - this.startY >
81+
this.minAcceptableDelta))
7782
) {
7883
clearTimeout(this.delayTimeout);
7984
this.activate();
@@ -84,34 +89,36 @@ export default class FlingGestureHandler extends GestureHandler {
8489
return false;
8590
}
8691

87-
private endFling(event: AdaptedEvent) {
88-
if (!this.tryEndFling(event)) {
92+
private endFling() {
93+
if (!this.tryEndFling()) {
8994
this.fail();
9095
}
9196
}
9297

9398
protected onPointerDown(event: AdaptedEvent): void {
9499
this.tracker.addToTracker(event);
100+
this.keyPointer = event.pointerId;
101+
95102
super.onPointerDown(event);
96-
this.newPointerAction(event);
103+
this.newPointerAction();
97104
}
98105

99106
protected onPointerAdd(event: AdaptedEvent): void {
100107
this.tracker.addToTracker(event);
101108
super.onPointerAdd(event);
102-
this.newPointerAction(event);
109+
this.newPointerAction();
103110
}
104111

105-
private newPointerAction(event: AdaptedEvent): void {
112+
private newPointerAction(): void {
106113
if (this.currentState === State.UNDETERMINED) {
107-
this.startFling(event);
114+
this.startFling();
108115
}
109116

110117
if (this.currentState !== State.BEGAN) {
111118
return;
112119
}
113120

114-
this.tryEndFling(event);
121+
this.tryEndFling();
115122

116123
if (
117124
this.tracker.getTrackedPointersCount() >
@@ -128,14 +135,16 @@ export default class FlingGestureHandler extends GestureHandler {
128135
return;
129136
}
130137

131-
this.tryEndFling(event);
138+
this.tryEndFling();
132139

133140
super.onPointerMove(event);
134141
}
135142

136143
protected onPointerUp(event: AdaptedEvent): void {
137144
super.onPointerUp(event);
138145
this.onUp(event);
146+
147+
this.keyPointer = NaN;
139148
}
140149

141150
protected onPointerRemove(event: AdaptedEvent): void {
@@ -148,7 +157,7 @@ export default class FlingGestureHandler extends GestureHandler {
148157
if (this.currentState !== State.BEGAN) {
149158
return;
150159
}
151-
this.endFling(event);
160+
this.endFling();
152161
}
153162

154163
protected onPointerCancel(event: AdaptedEvent): void {

0 commit comments

Comments
 (0)