or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

Files

docs

advanced-components.mdbuttons.mdcomponents.mdconstants.mdevents.mdgestures.mdindex.mdsetup.md

events.mddocs/

0

# Gesture Event System

1

2

Comprehensive event types and payload structures for handling gesture interactions with detailed coordinate and timing information.

3

4

## Capabilities

5

6

### Core Event Types

7

8

Base event types used throughout the gesture handling system.

9

10

```typescript { .api }

11

/**

12

* Basic gesture event structure

13

* Contains native event data with handler and state information

14

*/

15

interface GestureEvent<T = Record<string, unknown>> {

16

nativeEvent: T & {

17

handlerTag: number;

18

numberOfPointers: number;

19

state: number;

20

};

21

}

22

23

/**

24

* Handler state change event structure

25

* Fired when gesture handler changes state (begin, active, end, etc.)

26

*/

27

interface HandlerStateChangeEvent<T = Record<string, unknown>> {

28

nativeEvent: T & {

29

handlerTag: number;

30

numberOfPointers: number;

31

state: number;

32

oldState: number;

33

};

34

}

35

```

36

37

### Modern API Event Types

38

39

Event types used with the new Gesture API (`GestureDetector` and `Gesture` factory).

40

41

```typescript { .api }

42

/**

43

* Update event for the modern Gesture API

44

* Provides real-time gesture data during interaction

45

*/

46

interface GestureUpdateEvent<T = Record<string, unknown>> {

47

x: number;

48

y: number;

49

absoluteX: number;

50

absoluteY: number;

51

handlerTag: number;

52

numberOfPointers: number;

53

state: number;

54

} & T;

55

56

/**

57

* State change event for the modern Gesture API

58

* Fired when gesture state transitions occur

59

*/

60

interface GestureStateChangeEvent<T = Record<string, unknown>> {

61

x: number;

62

y: number;

63

absoluteX: number;

64

absoluteY: number;

65

handlerTag: number;

66

numberOfPointers: number;

67

state: number;

68

oldState: number;

69

} & T;

70

```

71

72

### Touch Event Types

73

74

Advanced touch event types providing detailed touch information.

75

76

```typescript { .api }

77

/**

78

* Touch event with multiple pointer support

79

* Contains detailed information about all active touches

80

*/

81

interface GestureTouchEvent {

82

handlerTag: number;

83

numberOfTouches: number;

84

state: number;

85

eventType: number;

86

allTouches: TouchData[];

87

changedTouches: TouchData[];

88

}

89

90

/**

91

* Individual touch data

92

* Detailed information about a single touch point

93

*/

94

interface TouchData {

95

id: number;

96

x: number;

97

y: number;

98

absoluteX: number;

99

absoluteY: number;

100

force?: number;

101

timestamp: number;

102

}

103

```

104

105

## Gesture-Specific Event Payloads

106

107

### Tap Gesture Events

108

109

Events specific to tap gesture interactions.

110

111

```typescript { .api }

112

/**

113

* Tap gesture event payload

114

* Contains position information for tap gestures

115

*/

116

interface TapGestureHandlerEventPayload {

117

x: number;

118

y: number;

119

absoluteX: number;

120

absoluteY: number;

121

}

122

123

// Complete tap gesture event types

124

type TapGestureHandlerGestureEvent = GestureEvent<TapGestureHandlerEventPayload>;

125

type TapGestureHandlerStateChangeEvent = HandlerStateChangeEvent<TapGestureHandlerEventPayload>;

126

```

127

128

### Pan Gesture Events

129

130

Events specific to pan/drag gesture interactions.

131

132

```typescript { .api }

133

/**

134

* Pan gesture event payload

135

* Contains position, translation, and velocity information

136

*/

137

interface PanGestureHandlerEventPayload {

138

x: number;

139

y: number;

140

absoluteX: number;

141

absoluteY: number;

142

translationX: number;

143

translationY: number;

144

velocityX: number;

145

velocityY: number;

146

stylusData?: StylusData;

147

}

148

149

/**

150

* Pan gesture change event payload (New API)

151

* Streamlined payload for modern pan gestures

152

*/

153

interface PanGestureChangeEventPayload {

154

translationX: number;

155

translationY: number;

156

velocityX: number;

157

velocityY: number;

158

}

159

160

/**

161

* Stylus-specific data for supported devices

162

*/

163

interface StylusData {

164

pressure: number;

165

tiltX: number;

166

tiltY: number;

167

twist: number;

168

}

169

170

// Complete pan gesture event types

171

type PanGestureHandlerGestureEvent = GestureEvent<PanGestureHandlerEventPayload>;

172

type PanGestureHandlerStateChangeEvent = HandlerStateChangeEvent<PanGestureHandlerEventPayload>;

173

```

174

175

### Pinch Gesture Events

176

177

Events specific to pinch/zoom gesture interactions.

178

179

```typescript { .api }

180

/**

181

* Pinch gesture event payload

182

* Contains scale factor and focal point information

183

*/

184

interface PinchGestureHandlerEventPayload {

185

x: number;

186

y: number;

187

absoluteX: number;

188

absoluteY: number;

189

scale: number;

190

focalX: number;

191

focalY: number;

192

velocity: number;

193

}

194

195

/**

196

* Pinch gesture change event payload (New API)

197

* Streamlined payload for modern pinch gestures

198

*/

199

interface PinchGestureChangeEventPayload {

200

scale: number;

201

focalX: number;

202

focalY: number;

203

velocity: number;

204

}

205

206

// Complete pinch gesture event types

207

type PinchGestureHandlerGestureEvent = GestureEvent<PinchGestureHandlerEventPayload>;

208

type PinchGestureHandlerStateChangeEvent = HandlerStateChangeEvent<PinchGestureHandlerEventPayload>;

209

```

210

211

### Rotation Gesture Events

212

213

Events specific to rotation gesture interactions.

214

215

```typescript { .api }

216

/**

217

* Rotation gesture event payload

218

* Contains rotation angle and anchor point information

219

*/

220

interface RotationGestureHandlerEventPayload {

221

x: number;

222

y: number;

223

absoluteX: number;

224

absoluteY: number;

225

rotation: number; // in radians

226

anchorX: number;

227

anchorY: number;

228

velocity: number;

229

}

230

231

// Complete rotation gesture event types

232

type RotationGestureHandlerGestureEvent = GestureEvent<RotationGestureHandlerEventPayload>;

233

type RotationGestureHandlerStateChangeEvent = HandlerStateChangeEvent<RotationGestureHandlerEventPayload>;

234

```

235

236

### Long Press Gesture Events

237

238

Events specific to long press gesture interactions.

239

240

```typescript { .api }

241

/**

242

* Long press gesture event payload

243

* Contains position and duration information

244

*/

245

interface LongPressGestureHandlerEventPayload {

246

x: number;

247

y: number;

248

absoluteX: number;

249

absoluteY: number;

250

duration: number; // in milliseconds

251

}

252

253

// Complete long press gesture event types

254

type LongPressGestureHandlerGestureEvent = GestureEvent<LongPressGestureHandlerEventPayload>;

255

type LongPressGestureHandlerStateChangeEvent = HandlerStateChangeEvent<LongPressGestureHandlerEventPayload>;

256

```

257

258

### Fling Gesture Events

259

260

Events specific to fling/swipe gesture interactions.

261

262

```typescript { .api }

263

/**

264

* Fling gesture event payload

265

* Contains position information for fling gestures

266

*/

267

interface FlingGestureHandlerEventPayload {

268

x: number;

269

y: number;

270

absoluteX: number;

271

absoluteY: number;

272

}

273

274

// Complete fling gesture event types

275

type FlingGestureHandlerGestureEvent = GestureEvent<FlingGestureHandlerEventPayload>;

276

type FlingGestureHandlerStateChangeEvent = HandlerStateChangeEvent<FlingGestureHandlerEventPayload>;

277

```

278

279

### Force Touch Gesture Events (Deprecated)

280

281

Events specific to force touch gesture interactions (deprecated feature).

282

283

```typescript { .api }

284

/**

285

* Force touch gesture event payload (deprecated)

286

* Contains position and force information

287

* @deprecated Force touch is deprecated

288

*/

289

interface ForceTouchGestureHandlerEventPayload {

290

x: number;

291

y: number;

292

absoluteX: number;

293

absoluteY: number;

294

force: number; // 0.0 to 1.0

295

}

296

297

/**

298

* Force touch gesture change event payload (New API, deprecated)

299

* @deprecated Force touch is deprecated

300

*/

301

interface ForceTouchGestureChangeEventPayload {

302

force: number;

303

}

304

305

// Complete force touch gesture event types

306

type ForceTouchGestureHandlerGestureEvent = GestureEvent<ForceTouchGestureHandlerEventPayload>;

307

type ForceTouchGestureHandlerStateChangeEvent = HandlerStateChangeEvent<ForceTouchGestureHandlerEventPayload>;

308

```

309

310

### Native View Gesture Events

311

312

Events specific to native view gesture interactions.

313

314

```typescript { .api }

315

/**

316

* Native view gesture event payload

317

* Contains pointer inside/outside information

318

*/

319

interface NativeViewGestureHandlerPayload {

320

pointerInside: boolean;

321

}

322

323

// Complete native view gesture event types

324

type NativeViewGestureHandlerGestureEvent = GestureEvent<NativeViewGestureHandlerPayload>;

325

type NativeViewGestureHandlerStateChangeEvent = HandlerStateChangeEvent<NativeViewGestureHandlerPayload>;

326

```

327

328

## Event Usage Examples

329

330

### Basic Event Handling

331

332

```typescript

333

import React from "react";

334

import { View, Text } from "react-native";

335

import { GestureDetector, Gesture } from "react-native-gesture-handler";

336

337

function EventHandlingExample() {

338

const tapGesture = Gesture.Tap()

339

.onBegin((event) => {

340

console.log("Tap began at:", event.x, event.y);

341

})

342

.onStart((event) => {

343

console.log("Tap started at:", event.absoluteX, event.absoluteY);

344

})

345

.onEnd((event) => {

346

console.log("Tap ended with state:", event.state);

347

});

348

349

const panGesture = Gesture.Pan()

350

.onUpdate((event) => {

351

console.log("Pan translation:", event.translationX, event.translationY);

352

console.log("Pan velocity:", event.velocityX, event.velocityY);

353

})

354

.onEnd((event) => {

355

console.log("Pan ended with final translation:", event.translationX, event.translationY);

356

});

357

358

return (

359

<GestureDetector gesture={Gesture.Simultaneous(tapGesture, panGesture)}>

360

<View style={{ width: 200, height: 200, backgroundColor: "lightblue" }}>

361

<Text>Tap and Pan Events</Text>

362

</View>

363

</GestureDetector>

364

);

365

}

366

```

367

368

### Advanced Event Processing

369

370

```typescript

371

import React, { useCallback } from "react";

372

import { View } from "react-native";

373

import { GestureDetector, Gesture } from "react-native-gesture-handler";

374

375

function AdvancedEventProcessing() {

376

const handlePinchUpdate = useCallback((event: GestureUpdateEvent<PinchGestureChangeEventPayload>) => {

377

const { scale, focalX, focalY, velocity } = event;

378

379

// Process pinch data

380

console.log(`Pinch: scale=${scale.toFixed(2)}, focal=(${focalX.toFixed(0)}, ${focalY.toFixed(0)})`);

381

382

// Apply scale with velocity damping

383

const dampedScale = scale * (1 - velocity * 0.01);

384

console.log(`Damped scale: ${dampedScale.toFixed(2)}`);

385

}, []);

386

387

const handleRotationUpdate = useCallback((event: GestureUpdateEvent<RotationGestureChangeEventPayload>) => {

388

const { rotation, anchorX, anchorY, velocity } = event;

389

390

// Convert radians to degrees

391

const degrees = (rotation * 180) / Math.PI;

392

console.log(`Rotation: ${degrees.toFixed(1)}°, anchor=(${anchorX.toFixed(0)}, ${anchorY.toFixed(0)})`);

393

}, []);

394

395

const pinchGesture = Gesture.Pinch().onUpdate(handlePinchUpdate);

396

const rotationGesture = Gesture.Rotation().onUpdate(handleRotationUpdate);

397

398

return (

399

<GestureDetector gesture={Gesture.Simultaneous(pinchGesture, rotationGesture)}>

400

<View style={{ width: 300, height: 300, backgroundColor: "lightgreen" }} />

401

</GestureDetector>

402

);

403

}

404

```

405

406

### Touch Event Processing

407

408

```typescript

409

import React from "react";

410

import { View } from "react-native";

411

import { GestureDetector, Gesture } from "react-native-gesture-handler";

412

413

function TouchEventProcessing() {

414

const panGesture = Gesture.Pan()

415

.onUpdate((event) => {

416

// Access basic touch information

417

console.log(`Touch at: (${event.x}, ${event.y})`);

418

console.log(`Absolute position: (${event.absoluteX}, ${event.absoluteY})`);

419

console.log(`Number of pointers: ${event.numberOfPointers}`);

420

421

// Pan-specific data

422

if ('translationX' in event && 'translationY' in event) {

423

console.log(`Translation: (${event.translationX}, ${event.translationY})`);

424

console.log(`Velocity: (${event.velocityX}, ${event.velocityY})`);

425

}

426

});

427

428

return (

429

<GestureDetector gesture={panGesture}>

430

<View style={{ width: 200, height: 200, backgroundColor: "orange" }} />

431

</GestureDetector>

432

);

433

}

434

```

435

436

## Event State Management

437

438

### Gesture States

439

440

Understanding gesture states is crucial for proper event handling:

441

442

```typescript

443

import { State } from "react-native-gesture-handler";

444

445

function handleStateChange(event: GestureStateChangeEvent) {

446

switch (event.state) {

447

case State.UNDETERMINED:

448

console.log("Gesture state: UNDETERMINED");

449

break;

450

case State.FAILED:

451

console.log("Gesture state: FAILED");

452

break;

453

case State.BEGAN:

454

console.log("Gesture state: BEGAN");

455

break;

456

case State.CANCELLED:

457

console.log("Gesture state: CANCELLED");

458

break;

459

case State.ACTIVE:

460

console.log("Gesture state: ACTIVE");

461

break;

462

case State.END:

463

console.log("Gesture state: END");

464

break;

465

}

466

}

467

```

468

469

### Event Timing

470

471

Events provide timing information for performance analysis:

472

473

```typescript

474

function analyzeEventTiming(event: GestureUpdateEvent) {

475

// Most events include timestamp information

476

const timestamp = Date.now();

477

console.log(`Event processed at: ${timestamp}`);

478

479

// For long press gestures, duration is available

480

if ('duration' in event) {

481

console.log(`Long press duration: ${event.duration}ms`);

482

}

483

}

484

```

485

486

## Performance Considerations

487

488

### Event Frequency

489

490

Gesture update events fire frequently. Optimize handlers for performance:

491

492

```typescript

493

import { runOnUI } from "react-native-reanimated";

494

495

// ✅ Good: Use runOnUI for performance-critical calculations

496

const panGesture = Gesture.Pan().onUpdate((event) => {

497

'worklet';

498

runOnUI(() => {

499

// Perform calculations on UI thread

500

const distance = Math.sqrt(event.translationX ** 2 + event.translationY ** 2);

501

console.log(`Distance: ${distance}`);

502

})();

503

});

504

505

// ❌ Avoid: Heavy calculations on JavaScript thread

506

const badPanGesture = Gesture.Pan().onUpdate((event) => {

507

// Heavy calculation on JS thread - will cause stuttering

508

const expensiveCalculation = performComplexMath(event);

509

});

510

```

511

512

### Memory Management

513

514

Properly clean up event handlers to prevent memory leaks:

515

516

```typescript

517

import React, { useEffect, useCallback } from "react";

518

519

function MemoryEfficientEvents() {

520

const handleUpdate = useCallback((event) => {

521

// Event handling logic

522

}, []);

523

524

useEffect(() => {

525

// Cleanup if needed

526

return () => {

527

// Clean up resources

528

};

529

}, []);

530

531

const gesture = Gesture.Pan().onUpdate(handleUpdate);

532

533

return (

534

<GestureDetector gesture={gesture}>

535

{/* Component content */}

536

</GestureDetector>

537

);

538

}

539

```