npm / react-native-gesture-handler
react-native-gesture-handler
What changed in react-native-gesture-handler 2 to 3, from its official release notes, upgrade guides and advisories. Sources checked 2026-10-18.
31 breaking2 deprecations21 new APIs and options1 performance21 behavior and defaults2 tooling133 fixes and other
See which of these apply to your code, ranked, in your agent:
npx @unstale/cli initreact-native-gesture-handler 3153 changes
Breaking changes 28
Touchable supports immediate press-out behavior, with the prop renamed from pressOutAfterAnimation; Pressable can opt out of the behavior.
shouldCancelWhenOutside now defaults to true.
Adopts AGP v9, which may affect Android build compatibility for developers using the package.
Buttons no longer call onPress while the keyboard is being dismissed.
Opacity is removed from Swipeable action panels.
Removes dispatchesReanimatedEvent from the initial config.
The package no longer emits CommonJS output.
Renames the Swipeable dragOffsetFrom*Edge prop.
gestureHandlerRootHOC is removed; update applications that still use it.
Detectors now throw an error if they are not placed inside GestureHandlerRootView.
The prop is renamed to effect; update existing component props.
InterceptingGestureDetector now throws when it is not rendered under GHRootView.
Moves the end flag to the event passed to onDeactivate and onFinalize.
The callback is renamed to onDeactivate; update gesture callback usage.
The callback is renamed to onActivate; update gesture callback usage.
The callback is renamed to onTouchesCancel; update existing callback usage.
Support for the old Paper architecture is removed; Gesture Handler 3 is rebuilt for the New Architecture.
RNGestureHandlerEnabledRootView is removed; update applications that still use it.
Changes SwipeableProps ref types from RefObject to Ref.
The field is renamed to handlerTag; update code that reads or supplies tag.
Removes
createNativeWrapperfrom Touchable.Uses a
disabledprop instead ofenabledon the button component.Removes the
onActiveStateChangecallback from Touchable.Adds the Touchable component, renamed from Clickable, as a button component for application code.
Changes the order in which Touchable callbacks are invoked.
Button activation timing changes; buttons no longer activate on start, and iOS activates them on pointer up.
The hook is renamed to useCompetingGestures; update existing imports and calls.
Adds the renamed native-gesture relation property for yielding to continuous gestures.
Deprecations 1
The builder API is deprecated.
New APIs and options 19
The legacy GestureDetector Wrap now exposes an animatable ref.
Adds an imperative API for testing gesture handlers.
Pressable is implemented based on Touchable.
Exports the PressableEvent type for consumers to use.
Touchable gains hover callbacks on Android, iOS, and Web.
Adds delaysChildPressedState to the native gesture.
Adds the rootContainerStyle prop to ReanimatedDrawerLayout.
Adds a prop to gesture handlers for cancelling the JS responder.
The missing cancelsTouchesInView option is added.
Handlers gain a changeEventCalculator option.
Gesture relations are introduced, with relation support also added for the web.
Gesture Handler 3 introduces a new hook-based API for defining gestures.
Adds a way to customize the out-animation duration for long press.
A manualActivation prop is added for gestures.
iOS Native gesture events now include numberOfPointers.
runOnJS is added to gesture configuration.
A StateManager API is introduced for gesture state management.
Adds a prop to control cancellation when the pointer leaves the button.
A new Touchable component is introduced.
Behavior and default changes 19
Can now be called from the first onTouchesDown on Android, iOS, and Web.
On Web, ScrollView now intercepts detectors.
The Web maxDelay default now matches native at 200 ms.
On Android, nested scrolling stops when a native handler's gesture ends.
On web, the native gesture activates when a real scroll occurs rather than when pointer distance passes a threshold.
GestureDetector now defaults moduleId to -1.
Derives Pressable's pressed state from testOnly_pressed.
Adds coordinates to Hover events on macOS.
Native gesture events now emit coordinates.
Touchable handles hover on Android and Apple platforms.
The testID property is ignored in production environments.
Uses v3 detectors in ReanimatedDrawerLayout.
Gestures can now be created without configuration.
GestureDetector can now have multiple children.
Web Pinch and Rotation gestures are continuous.
Changes Touchable's default underlay props.
Adds hover effects for Touchable on the web.
Button animations support reduced-motion preferences and animation scale.
VirtualDetector is made part of the public API.
Tooling 2
iOS builds now support Swift Package Manager.
Type definitions now support TypeScript's exactOptionalPropertyTypes option.
Fixes and other changes 84
On Web, changes to composed gestures are detected by the detector.
On Android, detector gestures are cancelled when a native view above them takes over the touch.
On Web, detector-owned DOM props are preserved across a full config replacement.
On Web, event coordinates are mapped through the view's full transform.
Late-mounted gesture objects are linked, and mount reactions without external relations are skipped.
Detector frames now cover transformed children.
Hidden and transparent buttons are skipped during hit testing.
On iOS, manualActivation is no longer ignored after a config update during a gesture.
Android gestures are cancelled on native ACTION_CANCEL.
On iOS, flags are preserved across a partial config update.
Android nested scrolling stops when the root starts intercepting.
On Android, onPressIn is dispatched when the native press starts.
On Android, the overflow ancestor pass is checked against the detector child's bounds.
Android gesture root views now respect pointer events.
Config values are resent from the UI thread after binding.
Pan offset updates now follow the sign of the SharedValue on every update.
On Android, Touchable presses are prevented when stopping ScrollView flings.
On Web, view-relative coordinates are corrected for trackpad pan events.
The ripple now forwards the borderless and foreground options.
On Android, a parent handler waiting for a child no longer cancels that child.
Keeps button hit testing within its own subtree on iOS.
Preserves disabled button targets under box-none parents on iOS.
On iOS, handlers detach when the detector view is recycled.
An in-progress press is canceled on iOS and released on Android when the button is disabled.
Resolves DrawerLayoutAndroid lazily to avoid an RN deprecation warning on import.
Resets enableTrackpadTwoFingerGesture in the web PanGestureHandler.
On web, replacing the full configuration resets NativeViewGestureHandler config, restores enabled, and refreshes the DOM.
On web, handlers are removed from the orchestrator when disabled mid-gesture or when they never began.
On Android, native handlers attach to the detector's child rather than a nested button.
Presses no longer become unresponsive when the keyboard belongs to a native field.
Resets numberOfPointers in LongPressGestureHandler.
On Android, buttons no longer fire press events when a scroll takes over the touch.
Fixes animation speed after rerender.
Keeps native handlers stable when event callbacks change.
Accumulated wheel delta is reset.
Pressable props were updated; the notes do not specify which props changed.
Forwards press handlers as testOnly_* in PressableWithTouchable.
Fixes Fling touch event delivery and consistent begin/end states on macOS.
Touchable now respects keyboardShouldPersistTaps="handled".
Fixes manualActivation failing to block gesture activation on macOS.
Prevents minDistance from being reset by partial configuration updates on Android.
Fixes the behavior of the minVelocity props.
Fixes Pan activation criteria being ignored on macOS.
Aligns pointerType behavior between native and JavaScript.
Fixes handling of requestDisallowInterceptTouchEvent for v3 on Android.
Passes empty callbacks to the UI when runOnJS is true.
Corrects the Tap offset on Web.
Corrects the calculation of timeDelta on Web.
Prevents a fatal crash when a touch event is serialized without allTouches.
Fixes touch events not being delivered on macOS.
Orphaned touch events are no longer dispatched.
Fixes iOS touch events not being delivered to VirtualDetector handlers.
Continuous gestures attached through VirtualGestureDetector now recognize on iOS.
Android buttons no longer delay the child pressed state.
Prevents gestures from being detached from other detectors on Web.
Ensures a gesture is not used across multiple detectors.
RootHelper no longer blocks the JS responder.
Fixes js responder cancelation in iOS modals.
Fixes handling of keyboardShouldPersistTaps so taps persist as expected while the keyboard is shown.
Fixes a crash when updating SharedValue.
Fixes text being selected during gestures on Android.
On Android, the detector now accounts for child transforms.
Native GestureDetector now handles zIndex correctly.
On iOS, the hooks API now cancels JS Responder as expected.
Android now applies numberOfPointers config to the pointer requirement in LongPressGestureHandler.
Fixes mouse interactions on Android.
Hidden action containers no longer receive pointer events on Android and Web.
Fixes a crash when Android Pressable is used with Reanimated animations.
Fixes invalid react-native/../react-native resolution for aliases in pods.
Gesture relations are fixed after freeze.
Fixes Android hover events recording gestures other than HoverGestureHandler.
Fixes the number of pointers reported on Android.
react-native-gesture-handler adds support for React Native 0.86.
Fixes an iOS build issue with React Native 0.87-nightly.
Fixes an Android crash with RN Screens FormSheet.
Improves TalkBack support on Android.
Fixes a build error on tvOS.
Fixes buttons that could not be pressed on tvOS.
Fixes the wrong coordinate space on web.
avgTouches is correctly exposed.
The onUpdate callback is restored for Native gestures.
Adds support for React Native 0.85.
Gesture Handler adds support for React Native 0.84.
Corrects Android Rotation handling and aligns it with iOS.
react-native-gesture-handler 258 changes
Breaking changes 3
Removes opacity from Swipeable action panels.
GestureDetector now throws when no gesture is passed.
Incorrectly exposed ReanimatedSwipeable props are now hidden.
Deprecations 1
The 2.x line supports React Native 0.87; newer React Native releases are supported in Gesture Handler 3.
New APIs and options 2
Forwards the borderless and foreground options from android_ripple.
Forwards the borderless and foreground options from android_ripple.
Performance 1
Memoizes the Text component.
Behavior and default changes 2
On Web, the wheel listener is passive and registered only for Pan.
iOS distinguishes mouse and stylus input when hovering.
Fixes and other changes 49
Android alpha traversal now uses the same gate as iOS.
Android clears a pending HOVER_EXIT finish when the hover handler is reset.
Android avoids a null pointer exception if a touch cancel callback finishes the handler mid-transition.
Fixes gesture callback guarantees when a view is detached mid-gesture on iOS.
Prevents a crash when a mount listener fires after GestureDetector unmounts.
Updates Pressable props.
Clears pending timers on unmount.
Stops nested scrolling when a native handler's gesture ends on Android.
Moves Tap cancelation to dispatch_after on iOS.
Removes UIPointerInteraction from the view when the hover handler is unbound.
Fixes mismatched coordinate space on iOS.
Fixes handler retrieval on iOS.
Discrete gestures on Android now trigger onFinalize correctly.
Fixes the RNRenderer import for React Native 0.86 and later.
Fixes duplicated testID values on iOS.
Fixes Pinch on the web.
Fixes TalkBack behavior on Android for Pressable.
Worklets are no longer checked for when the Babel plugin was not used.
Fixes TypeScript errors in Touchables.
Android clears blocking relations when a gesture handler is dropped.
iOS handles FullWindowOverlay as the native root.
Fixes GestureDetector becoming unresponsive after a display:none toggle in the New Architecture.
Fixes compilation of RNGestureHandlerModule with Kotlin 2.3.
Fixes a missing onFinalize callback in the Tap gesture on iOS.
Android now checks all pointers in move events.
Fixes the incorrect pointerType in the iOS Hover gesture.
Handles pointerEvents for Pressable on iOS and Android.
Guards +load with an #ifdef for RCT_DYNAMIC_FRAMEWORKS.
Fixed the React 19 error caused by accessing element.ref on Web.
Fixed experimental pointers breaking after a pan on Android.
The GestureRef type now accepts null.
Fixed a crash involving manual activation on iOS.
On iOS, pan gestures blocked from activating now trigger onFinalize.
Fixed onFinalize callbacks on iOS 26.
Fixed the number of touches becoming 0 for pan gestures on Apple trackpads.
Fixed press out behavior on Web.
Added support for react-native 0.83.
Fixed buttons not receiving onPress.
Fixed a memory leak when ReanimatedSwipeable is closed programmatically.
Fixed Android scroll actions being interpreted as touch.
Fixes the ripple effect on Android.
Fixes gestures not activating due to an outdated handler tag.
Fixes gestures not ending properly on iOS 26.
Fixes gestures on iOS 26.
Excludes libfbjni.so.
Prevents onPress from being called when Pressable is cancelled.
Adds support for react-native 0.82.
Fixes the grabbing delegate in setPressed.
Ensures SwipeDirection is imported as a value in ReanimatedSwipeable.