Skip to content

Commit 94317a2

Browse files
authored
fix: touch event absolute position (#3078)
## Description The PR fixes the issue mentioned [here](#3073) about the incorrect absolute positions on touch events. The view transformations should not affect the absolute position of the touch, so the source event should also be passed to gesture handlers and used for calculations. It applies to `ACTION_DOWN`, `ACTION_MOVE`, and `ACTION_UP` motion events. <!-- Description and motivation for this PR. Include 'Fixes #<number>' if this is fixing some issue. --> ## Test plan I've checked on android device for repro provided in the above-mentioned issue with some scroll offset. <!-- Describe how did you test this change here. -->
1 parent 37c6ad7 commit 94317a2

File tree

2 files changed

+23
-23
lines changed

2 files changed

+23
-23
lines changed

android/src/main/java/com/swmansion/gesturehandler/core/GestureHandler.kt

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -397,19 +397,19 @@ open class GestureHandler<ConcreteGestureHandlerT : GestureHandler<ConcreteGestu
397397
}
398398
}
399399

400-
private fun dispatchTouchDownEvent(event: MotionEvent) {
400+
private fun dispatchTouchDownEvent(event: MotionEvent, sourceEvent: MotionEvent) {
401401
changedTouchesPayload = null
402402
touchEventType = RNGestureHandlerTouchEvent.EVENT_TOUCH_DOWN
403403
val pointerId = event.getPointerId(event.actionIndex)
404-
val offsetX = event.rawX - event.x
405-
val offsetY = event.rawY - event.y
404+
val offsetX = sourceEvent.rawX - sourceEvent.x
405+
val offsetY = sourceEvent.rawY - sourceEvent.y
406406

407407
trackedPointers[pointerId] = PointerData(
408408
pointerId,
409409
event.getX(event.actionIndex),
410410
event.getY(event.actionIndex),
411-
event.getX(event.actionIndex) + offsetX - windowOffset[0],
412-
event.getY(event.actionIndex) + offsetY - windowOffset[1],
411+
sourceEvent.getX(event.actionIndex) + offsetX - windowOffset[0],
412+
sourceEvent.getY(event.actionIndex) + offsetY - windowOffset[1],
413413
)
414414
trackedPointersCount++
415415
addChangedPointer(trackedPointers[pointerId]!!)
@@ -418,20 +418,20 @@ open class GestureHandler<ConcreteGestureHandlerT : GestureHandler<ConcreteGestu
418418
dispatchTouchEvent()
419419
}
420420

421-
private fun dispatchTouchUpEvent(event: MotionEvent) {
421+
private fun dispatchTouchUpEvent(event: MotionEvent, sourceEvent: MotionEvent) {
422422
extractAllPointersData()
423423
changedTouchesPayload = null
424424
touchEventType = RNGestureHandlerTouchEvent.EVENT_TOUCH_UP
425425
val pointerId = event.getPointerId(event.actionIndex)
426-
val offsetX = event.rawX - event.x
427-
val offsetY = event.rawY - event.y
426+
val offsetX = sourceEvent.rawX - sourceEvent.x
427+
val offsetY = sourceEvent.rawY - sourceEvent.y
428428

429429
trackedPointers[pointerId] = PointerData(
430430
pointerId,
431431
event.getX(event.actionIndex),
432432
event.getY(event.actionIndex),
433-
event.getX(event.actionIndex) + offsetX - windowOffset[0],
434-
event.getY(event.actionIndex) + offsetY - windowOffset[1],
433+
sourceEvent.getX(event.actionIndex) + offsetX - windowOffset[0],
434+
sourceEvent.getY(event.actionIndex) + offsetY - windowOffset[1],
435435
)
436436
addChangedPointer(trackedPointers[pointerId]!!)
437437
trackedPointers[pointerId] = null
@@ -440,11 +440,11 @@ open class GestureHandler<ConcreteGestureHandlerT : GestureHandler<ConcreteGestu
440440
dispatchTouchEvent()
441441
}
442442

443-
private fun dispatchTouchMoveEvent(event: MotionEvent) {
443+
private fun dispatchTouchMoveEvent(event: MotionEvent, sourceEvent: MotionEvent) {
444444
changedTouchesPayload = null
445445
touchEventType = RNGestureHandlerTouchEvent.EVENT_TOUCH_MOVE
446-
val offsetX = event.rawX - event.x
447-
val offsetY = event.rawY - event.y
446+
val offsetX = sourceEvent.rawX - sourceEvent.x
447+
val offsetY = sourceEvent.rawY - sourceEvent.y
448448
var pointersAdded = 0
449449

450450
for (i in 0 until event.pointerCount) {
@@ -454,8 +454,8 @@ open class GestureHandler<ConcreteGestureHandlerT : GestureHandler<ConcreteGestu
454454
if (pointer.x != event.getX(i) || pointer.y != event.getY(i)) {
455455
pointer.x = event.getX(i)
456456
pointer.y = event.getY(i)
457-
pointer.absoluteX = event.getX(i) + offsetX - windowOffset[0]
458-
pointer.absoluteY = event.getY(i) + offsetY - windowOffset[1]
457+
pointer.absoluteX = sourceEvent.getX(i) + offsetX - windowOffset[0]
458+
pointer.absoluteY = sourceEvent.getY(i) + offsetY - windowOffset[1]
459459

460460
addChangedPointer(pointer)
461461
pointersAdded++
@@ -471,15 +471,15 @@ open class GestureHandler<ConcreteGestureHandlerT : GestureHandler<ConcreteGestu
471471
}
472472
}
473473

474-
fun updatePointerData(event: MotionEvent) {
474+
fun updatePointerData(event: MotionEvent, sourceEvent: MotionEvent) {
475475
if (event.actionMasked == MotionEvent.ACTION_DOWN || event.actionMasked == MotionEvent.ACTION_POINTER_DOWN) {
476-
dispatchTouchDownEvent(event)
477-
dispatchTouchMoveEvent(event)
476+
dispatchTouchDownEvent(event, sourceEvent)
477+
dispatchTouchMoveEvent(event, sourceEvent)
478478
} else if (event.actionMasked == MotionEvent.ACTION_UP || event.actionMasked == MotionEvent.ACTION_POINTER_UP) {
479-
dispatchTouchMoveEvent(event)
480-
dispatchTouchUpEvent(event)
479+
dispatchTouchMoveEvent(event, sourceEvent)
480+
dispatchTouchUpEvent(event, sourceEvent)
481481
} else if (event.actionMasked == MotionEvent.ACTION_MOVE) {
482-
dispatchTouchMoveEvent(event)
482+
dispatchTouchMoveEvent(event, sourceEvent)
483483
}
484484
}
485485

android/src/main/java/com/swmansion/gesturehandler/core/GestureHandlerOrchestrator.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,7 @@ class GestureHandlerOrchestrator(
270270
// the first `onTouchesDown` event after the handler processes it and changes state
271271
// to `BEGAN`.
272272
if (handler.needsPointerData && handler.state != 0) {
273-
handler.updatePointerData(event)
273+
handler.updatePointerData(event, sourceEvent)
274274
}
275275

276276
if (!handler.isAwaiting || action != MotionEvent.ACTION_MOVE) {
@@ -292,7 +292,7 @@ class GestureHandlerOrchestrator(
292292
}
293293

294294
if (handler.needsPointerData && isFirstEvent) {
295-
handler.updatePointerData(event)
295+
handler.updatePointerData(event, sourceEvent)
296296
}
297297

298298
// if event was of type UP or POINTER_UP we request handler to stop tracking now that

0 commit comments

Comments
 (0)