React Native's built-in touch system is fine for simple taps but struggles with complex, interruptible gestures. react-native-gesture-handler replaces it with a native gesture-recognition system that runs off the JS thread, which is what makes smooth swipeable rows, drawers, and bottom sheets possible.
Key takeaways
- Native gesture recognition runs off the JS thread, so gestures stay responsive under load.
- Compose gestures (simultaneous, exclusive, race) with the modern Gesture API.
- Pair it with Reanimated to drive animations directly from gesture state.
Why replace the default touch system
The default responder system makes touch decisions in JavaScript, which can lag and cannot easily express relationships between competing gestures. Gesture Handler moves recognition to the native layer and gives you a declarative way to define pan, pinch, rotation, tap, long-press, and fling gestures.
Wrap your app in GestureHandlerRootView and build interactions with the Gesture API, which is cleaner than the older component-based handlers.
Composing gestures
Real interactions combine gestures: a card you can both drag and tap, or a pinch-to-zoom that also pans. The library lets you compose gestures as simultaneous, exclusive, or racing, so you can express exactly how competing touches should resolve without brittle manual state.
Pairing with Reanimated
Gesture Handler and Reanimated are designed to work together on the UI thread. Updating shared values from a gesture callback lets you animate directly in response to the user's finger with no JS round trip — the foundation of swipe-to-dismiss, draggable sheets, and similar polished interactions.