diff --git a/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/core/GestureHandler.kt b/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/core/GestureHandler.kt index 2f1a12b83a..2dde59e8a2 100644 --- a/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/core/GestureHandler.kt +++ b/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/core/GestureHandler.kt @@ -258,7 +258,7 @@ open class GestureHandler { trackedPointersIDsCount-- } - private fun isTrackingPointer(pointerId: Int) = trackedPointerIDs[pointerId] != -1 + fun isTrackingPointer(pointerId: Int) = trackedPointerIDs[pointerId] != -1 private fun needAdapt(event: MotionEvent): Boolean { if (event.pointerCount != trackedPointersIDsCount) { diff --git a/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/core/GestureHandlerOrchestrator.kt b/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/core/GestureHandlerOrchestrator.kt index 71ace5fd8b..ca21b932b6 100644 --- a/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/core/GestureHandlerOrchestrator.kt +++ b/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/core/GestureHandlerOrchestrator.kt @@ -533,7 +533,7 @@ class GestureHandlerOrchestrator( } } - fun recordHandlerIfNotPresent(handler: GestureHandler, view: View?) { + fun recordHandlerIfNotPresent(handler: GestureHandler, view: View?, pointerId: Int = -1) { if (gestureHandlers.contains(handler)) { return } @@ -543,7 +543,9 @@ class GestureHandlerOrchestrator( handler.activationIndex = Int.MAX_VALUE handler.prepare(view, this) - if (!handler.shouldBeginWithRecordedHandlers(gestureHandlers)) { + // Only handlers extracted for the same pointer (they already track it) may block this one + val recorded = if (pointerId >= 0) gestureHandlers.filter { it.isTrackingPointer(pointerId) } else emptyList() + if (!handler.shouldBeginWithRecordedHandlers(recorded)) { handler.cancel() } @@ -589,7 +591,7 @@ class GestureHandlerOrchestrator( if (handler.isEnabled && handler.isWithinBounds(view, coords[0], coords[1])) { found = true - recordHandlerIfNotPresent(handler, parentViewGroup) + recordHandlerIfNotPresent(handler, parentViewGroup, pointerId) handler.startTrackingPointer(pointerId) } } @@ -654,7 +656,7 @@ class GestureHandlerOrchestrator( continue } - recordHandlerIfNotPresent(handler, view) + recordHandlerIfNotPresent(handler, view, pointerId) handler.startTrackingPointer(pointerId) found = true } @@ -691,7 +693,7 @@ class GestureHandlerOrchestrator( continue } - recordHandlerIfNotPresent(handler, view) + recordHandlerIfNotPresent(handler, view, pointerId) handler.startTrackingPointer(pointerId) found = true }