Where Gesture Config Lives
TSX
Supported Directions
gestureDirection accepts pan and pinch directions:
"horizontal""horizontal-inverted""vertical""vertical-inverted""bidirectional""pinch-in""pinch-out"- an array of pan and pinch directions
- structured entries such as
{ gesture: "vertical", area: "edge" }
For non-snap screens, each direction in the array can activate dismissal. For screens with snapPoints, the array defines which pan axes and pinch direction can drive the same snap state. The first direction on a pan axis controls that axis's collapse polarity, and the first pinch direction controls whether pinch-in or pinch-out collapses.
Pan entries can include an activation area:
TSX
area accepts "screen", "edge", or a numeric edge distance in points. Pinch entries ignore area.
Rotation is not a gestureDirection value. When a screen enables pinch-in or pinch-out, rotation runs alongside pinch and publishes gesture.rotation.
Gesture Options
gestureEnabled
Enables swipe-to-dismiss. For screens with snapPoints, snapping between non-dismiss detents can still work when this is false.
| type | default | required |
|---|---|---|
boolean | undefined | No |
gestureDirection
Dismiss direction, pan axis, pinch direction, or ordered direction list.
| type | default | required |
|---|---|---|
GestureDirectionEntry | GestureDirectionEntry[] | "horizontal" | No |
gestureTracking
Controls whether the screen tracks live gesture values.
| type | default | required |
|---|---|---|
"auto" | "never" | "always" | "auto" | No |
gestureSensitivity
Multiplies live gesture movement before it drives progress and non-raw gesture values.
| type | default | required |
|---|---|---|
number | 1 | No |
gestureVelocityImpact
Release velocity influence on dismiss decisions.
| type | default | required |
|---|---|---|
number | 0.3 | No |
gestureSnapVelocityImpact
Release velocity influence on snap-target selection.
| type | default | required |
|---|---|---|
number | 0.1 | No |
gestureSnapLocked
Locks gesture-driven snap movement to the current detent.
| type | default | required |
|---|---|---|
boolean | false | No |
sheetSnapBehavior
Controls how a drag maps movement between snap points. "continuous" maps
movement directly to global progress and can cross multiple snap points.
"step" gives the adjacent interval a full normalized drag range and limits
each gesture to one snap-point step.
| type | default | required |
|---|---|---|
"continuous" | "step" | "continuous" | No |
gestureReleaseVelocityScale
Multiplies normalized release velocity before the spring runs.
| type | default | required |
|---|---|---|
number | 1 | No |
sheetScrollGestureBehavior
Scroll-boundary handoff mode for snap sheets.
| type | default | required |
|---|---|---|
"expand-and-collapse" | "collapse-only" | "expand-and-collapse" | No |
See Snap Points for transition-aware scrollables and the complete handoff behavior.
Per-Direction Activation Area
TSX
Configure each active pan direction independently:
TSX
"edge" uses the default edge hit area. A number uses that many points from the edge.
Release Tuning
These options control how release velocity affects the outcome and the spring feel:
TSX
- use
gestureVelocityImpactto change whether a fling dismisses - use
gestureSnapVelocityImpactto change which snap point a sheet settles to - use
gestureReleaseVelocityScaleto change the release energy used by gesture reset and handoff values
Pinch Gestures
Use pinch-in or pinch-out when two-finger scale should drive dismissal:
TSX
active.gesture.scale, active.gesture.normScale, active.gesture.focalX, and active.gesture.focalY are available inside the interpolator. Use active.gesture.raw.normScale when computing dynamic gestureSensitivity, so the sensitivity calculation does not feed back into itself.
Pan, pinch, and rotation run as a simultaneous gesture composition when the screen config allows them. The gesture that is currently active owns navigation release, while the other gestures can still update live values for animation.
Rotation Values
Screens with pinch-in or pinch-out also track two-finger rotation.
TSX
Use current.gesture.raw.rotation when you need the physical rotation before gestureSensitivity is applied.
Progress During Gestures
progress always includes live gesture movement. This is the value you want when the screen should follow the user's finger.
Use current.transitionProgress when animation logic needs transition or snap progress without the active gesture:
TSX
Dynamic Gesture Options
React-side option changes can be applied while the screen stays mounted:
TSX
For per-frame changes from a worklet, return runtime options from the interpolator:
TSX
active.options exposes the resolved option state back to the interpolator, so animation logic can react to values changed by navigation.setOptions() or by previous runtime overrides.
Gesture Tracking
Use gestureTracking when a screen needs explicit control over live gesture values:
TSX
"auto" tracks gestures when dismissal is enabled, or when snap points can move without dismissal. "always" keeps tracking while gestureEnabled is false, which is useful for resistance or shadowing effects where the screen should visually respond to a gesture but must not dismiss. "never" disables tracking for the screen, including snap gestures.
Snap Sheets
Snap sheets are regular screens with snapPoints:
TSX
Two behaviors matter here:
gestureEnabled: falsedisables dismiss at the minimum detent, but the screen can still snap between non-dismiss detentsgestureSnapLockedlocks gesture-driven snap movement to the current detent, while programmatic changes such asnavigation.setOptions()orsnapTo()can still change behaviorsheetSnapBehavior: "step"makes each gesture operate only between its starting detent and one adjacent detent
Use step behavior when nearby snap points should still require a deliberate
drag. For example, the 0.9 to 1 interval below receives the same normalized
drag range as any other adjacent interval:
TSX
If you want to toggle snap locking at runtime:
TSX
Reading Gesture State
Gesture values are exposed inside the interpolator on current.gesture:
TSX
Useful values include:
x,ynormX,normYscale,normScalefocalX,focalYpinchOriginX,pinchOriginYrotationvelocityrawinitiatorhandoffdraggingdismissingsettling
Live gesture values reset after release. If a dismiss animation needs the last release-time values while the live fields reset, read current.gesture.handoff.
focalX and focalY are live screen coordinates and can move with the fingers. pinchOriginX and pinchOriginY capture the screen-coordinate focal point at activation, which is usually the correct pivot for stable pinch-and-rotate transforms.
Hook Targeting
TSX
useScreenGesture() returns a navigator pan-gesture ref for Gesture Handler relations:
TSX
useScreenGesture() supports depth: 0 for the current screen and negative depths for ancestors. useScreenAnimation() also supports positive depths for descendant transition scopes. Ancestor targeting stops at navigation-host isolation boundaries, where negative depths resolve to null.