For AI agents: the complete documentation index is available at https://react-native-gesture-image-viewer.pages.dev/1.x/llms.txt, the full documentation bundle is available at https://react-native-gesture-image-viewer.pages.dev/1.x/llms-full.txt, and this page is available as Markdown at https://react-native-gesture-image-viewer.pages.dev/1.x/guide/getting-started/quick-start.md.
v3 is stable. See what changed
  • English
  • 1.x
  • Quick Start

    Demo of react-native-gesture-image-viewer gestures

    Examples & Demo

    Installation

    Important

    react-native-gesture-image-viewer is a high-performance viewer library built on react-native-reanimated and react-native-gesture-handler.
    Therefore, you must install React Native Reanimated and Gesture Handler before using this library. If you haven't set it up yet, please refer to the installation guide.

    npm
    yarn
    pnpm
    bun
    deno
    npm install react-native-gesture-image-viewer@1.x

    Basic Usage

    react-native-gesture-image-viewer is a library focused purely on gesture interactions for complete customization.

    import { useCallback, useState } from 'react';
    import { ScrollView, Image, Modal, View, Text, Button } from 'react-native';
    import { GestureViewer, GestureTrigger, useGestureViewerController, useGestureViewerEvent } from 'react-native-gesture-image-viewer';
    
    function App() {
      const images = [...];
      const [visible, setVisible] = useState(false);
      const [selectedIndex, setSelectedIndex] = useState(0);
    
      const { goToIndex, goToPrevious, goToNext, currentIndex, totalCount } = useGestureViewerController();
    
      const openModal = (index: number) => {
        setSelectedIndex(index);
        setVisible(true);
      };
    
      const renderImage = useCallback((imageUrl: string) => {
        return <Image source={{ uri: imageUrl }} style={{ width: '100%', height: '100%' }} resizeMode="contain" />;
      }, []);
    
      useGestureViewerEvent('zoomChange', (data) => {
        console.log(`Zoom changed from ${data.previousScale} to ${data.scale}`);
      });
    
      return (
        <View>
          {images.map((uri, index) => (
            <GestureTrigger key={uri} onPress={() => openModal(index)}>
              <Pressable>
                <Image source={{ uri }} />
              </Pressable>
            </GestureTrigger>
          ))}
          <Modal transparent visible={visible}>
            <GestureViewer
              data={images}
              initialIndex={selectedIndex}
              renderItem={renderImage}
              ListComponent={ScrollView}
              onDismiss={() => setVisible(false)}
            />
            <View>
              <Button title="Prev" onPress={goToPrevious} />
              <Button title="Jump to index 2" onPress={() => goToIndex(2)} />
              <Button title="Next" onPress={goToNext} />
              <Text>{`${currentIndex + 1} / ${totalCount}`}</Text>
            </View>
          </Modal>
        </View>
      );
    }