React Native's built-in `Pressable` and touch events on `View` are enough for a button, but they fall apart the moment two gestures need to negotiate over the same touch — a horizontal swipe inside a vertically scrolling list, a pinch-to-zoom photo that also needs to be pannable, or a bottom sheet whose drag handle should win over the scroll view beneath it. The previous lesson introduced Reanimated's worklet model as the answer to running animation logic on the UI thread; this lesson covers the other half of that story, react-native-gesture-handler, which is what actually recognizes gestures using native, platform-level touch handling rather than React Native's JavaScript-driven `PanResponder`, and gives you explicit control over which gesture wins when two are plausible candidates for the same touch.
The failure mode without this discipline is specific: a card meant to swipe horizontally inside a vertical list either steals every vertical scroll attempt near it, or never recognizes a horizontal swipe because the list's own scroll gesture claims the touch first, and toggling between the two by trial and error rarely produces a result that feels right in every direction a user might actually swipe. Gesture composition — deciding explicitly which gestures can run together, which must fail before another begins, and which one gesture should win outright — is what makes an interaction feel deliberate instead of accidental.
This lesson builds on the shared-value and worklet model from the previous lesson and treats a gesture as something with a real lifecycle — begin, update, end, or fail — that has to be reasoned about explicitly against every other gesture recognizer that could plausibly claim the same touch, not assumed to "just work" because a single gesture works fine in isolation during a quick manual test.