The three most common gestures differ in what they wait for. A pan activates once the finger has moved a little (tune it with minDistance(), activeOffsetX() or failOffsetY()) and then reports translation and velocity on every move. A tap succeeds if the finger lifts quickly without moving far (maxDuration(), maxDist(), numberOfTaps()). A fling fires once, for a fast swipe in one of the direction()s you allow, without tracking the finger. The demo gives each its own card and logs from JavaScript with .runOnJS(true):
const pan = Gesture.Pan().runOnJS(true) // callbacks on the JS thread (for logging)
.onBegin(() => { resetClock(); log('pan begin'); })
.onStart((e) => log('pan start after', r(e.translationX), 'dp'))
.onEnd((e) => log('pan end', r(e.translationX), r(e.translationY),
'velocity', r(e.velocityX)));
const single = Gesture.Tap().runOnJS(true).onEnd(() => log('single tap'));
const double = Gesture.Tap().numberOfTaps(2).runOnJS(true)
.onEnd(() => log('double tap'));
const taps = Gesture.Exclusive(double, single); // try double first, then single
const fling = Gesture.Fling().direction(Directions.LEFT | Directions.RIGHT).runOnJS(true)
.onEnd((e) => log('fling ended at x =', r(e.x)));
// ...each attached with <GestureDetector gesture={...}> to its own cardA 600 ms drag on the first card, a tap and then a double tap on the second, and on the third a quick 80 ms swipe followed by a slow 1.5 s one:
LOG +0ms pan begin LOG +47ms pan start after 0 dp LOG +570ms pan end 170 24 velocity 317 LOG +4118ms single tap LOG +7224ms double tap LOG +10535ms fling ended at x = 170
Only the quick swipe counted as a fling. Translations are in dp, velocities in dp per second, and the double tap logged no single tap first.