Skip to main content
The Vibration API provides access to the device’s vibration functionality. You can trigger single vibrations or pattern-based vibrations.

Methods

vibrate()

static vibrate(pattern?: number | number[], repeat?: boolean)
Triggers a vibration with the specified pattern.
pattern
number | number[]
default:"400"
Vibration pattern:
  • number: Duration in milliseconds to vibrate
  • array: Pattern of durations alternating between vibrate and pause
    • Example: [0, 500, 200, 500] means:
      • Wait 0ms
      • Vibrate 500ms
      • Pause 200ms
      • Vibrate 500ms
repeat
boolean
default:"false"
Whether to repeat the vibration pattern. Only applies when pattern is an array.Android: Repeats from the first vibration (index 0)iOS: Repeats the entire pattern

Platform Differences

Android

  • Supports both single vibrations and pattern arrays
  • Pattern arrays are passed directly to the native module
  • Repeat behavior starts from index 0
  • Requires VIBRATE permission in AndroidManifest.xml:
<uses-permission android:name="android.permission.VIBRATE"/>

iOS

  • Supports single vibrations and pattern arrays
  • Pattern arrays are processed in JavaScript with scheduling
  • Default vibration duration is 400ms regardless of the number passed
  • No permissions required

cancel()

static cancel()
Stops any ongoing vibration. Android: Calls the native cancel method iOS: Sets internal flag to stop scheduled vibrations

Examples

Single Vibration

import {Button, Vibration} from 'react-native';

function SingleVibration() {
  return (
    <Button
      title="Vibrate for 1 second"
      onPress={() => Vibration.vibrate(1000)}
    />
  );
}

Default Vibration

import {Button, Vibration} from 'react-native';

function DefaultVibration() {
  return (
    <Button
      title="Vibrate (default 400ms)"
      onPress={() => Vibration.vibrate()}
    />
  );
}

Pattern Vibration

import {Button, Vibration} from 'react-native';

function PatternVibration() {
  // Pattern: wait 0ms, vibrate 500ms, pause 200ms, vibrate 500ms
  const pattern = [0, 500, 200, 500];

  return (
    <Button
      title="Vibrate with pattern"
      onPress={() => Vibration.vibrate(pattern)}
    />
  );
}

Repeating Pattern

import React, {useState} from 'react';
import {Button, Vibration, View} from 'react-native';

function RepeatingVibration() {
  const [isVibrating, setIsVibrating] = useState(false);
  const pattern = [1000, 2000, 3000];

  const startVibration = () => {
    setIsVibrating(true);
    Vibration.vibrate(pattern, true);
  };

  const stopVibration = () => {
    setIsVibrating(false);
    Vibration.cancel();
  };

  return (
    <View>
      {!isVibrating ? (
        <Button title="Start Repeating" onPress={startVibration} />
      ) : (
        <Button title="Stop Vibration" onPress={stopVibration} />
      )}
    </View>
  );
}

Custom Alert Pattern

import {Button, Vibration} from 'react-native';

function AlertPattern() {
  // Three short bursts
  const pattern = [0, 100, 100, 100, 100, 100];

  return (
    <Button
      title="Alert Vibration"
      onPress={() => Vibration.vibrate(pattern)}
    />
  );
}

SOS Pattern

import {Button, Vibration} from 'react-native';

function SOSPattern() {
  // SOS in Morse code: ... --- ...
  const pattern = [
    0, 200, 100, 200, 100, 200,  // S
    300,                           // pause
    600, 300, 600, 300, 600,       // O
    300,                           // pause
    200, 100, 200, 100, 200        // S
  ];

  return (
    <Button
      title="Vibrate SOS"
      onPress={() => Vibration.vibrate(pattern)}
    />
  );
}

Notes

  • On iOS, the vibration duration cannot be customized; the device will always vibrate for approximately 400ms
  • Android allows custom duration vibrations
  • Always call cancel() when stopping a repeating vibration pattern
  • Excessive vibration can drain battery and annoy users - use judiciously
  • Test vibration patterns on physical devices as simulators/emulators may not support vibration

Build docs developers (and LLMs) love