Home

Awesome

react-native-image-modal

react-native-image-modal is a simple full size modal image for iOS and Android.

You can pinch zoom-in/out, double-tap zoom-in/out, move and swipe-to-dismiss.

Document

Blog

There are blog posts about how to use react-native-image-modal.

Installation

Execute the command to install react-native-image-modal.

# npm
npm install --save react-native-image-modal

# yarn
yarn add --dev react-native-image-modal

# pnpm
pnpm add --save react-native-image-modal

How to use

Import react-native-image-modal.

import ImageModal from 'react-native-image-modal'

Add the source code below to where you want to use it.

return (
  <ImageModal
    resizeMode='contain'
    imageBackgroundColor='#000000'
    style={{
      width: 250,
      height: 250,
    }}
    source={{
      uri: 'https://cdn.pixabay.com/photo/2019/07/25/18/58/church-4363258_960_720.jpg',
    }}
  />
)

Custom Image component

If you want to use a custom image component like react-native-fast-image or expo-image, you can use renderImageComponent property.

import FastImage, {ImageStyle, ResizeMode} from 'react-native-fast-image';

<ImageModal
  style={{
    width: imageWidth,
    height: 250,
  }}
  source={{
    uri: 'https://cdn.pixabay.com/photo/2018/01/11/09/52/three-3075752_960_720.jpg',
  }}
  renderImageComponent={({source, resizeMode, style}) => (
    <FastImage
      style={style as StyleProp<ImageStyle>}
      source={source as ImageRequireSource}
      resizeMode={resizeMode as ResizeMode}
    />
  )}
/>

Properties

You can use All props of React Native Image for the original image(not full size modal image). Below are react-native-image-modal specific properties.

ProprequiredTypeDescription
renderToHardwareTextureAndroidXbooleanIt is for Android animation. Default is true. If you don't want to use Hardware Texture on Android, set false.
isTranslucentXbooleanif you use translucent status bar in android, set true to prevent wrong position animation. (In Expo, translucent default is true)
swipeToDismissXbooleanset true to swipe to dismiss (default: true)
imageBackgroundColorXstringbackground color for the original image
overlayBackgroundColorXstringbackground color for the full size modal(default: #000000)
(Deprecated) modalRefXImageDetailYou can use this Ref for closing the Modal programmatically. (This pros is deprecated. Please use the ref props.)
refXReactNativeImageModalYou can use this Ref for opening or closing the Modal programmatically.
disabledXbooleandisable opening the modal
modalImageStyleXImageStyleImage Style in Modal
resizeModeXResizeMode('contain', 'cover', 'stretch','center')Image resizeMode
modalImageResizeModeXResizeMode('contain', 'cover', 'stretch','center')Image resizeMode for modal image. If it is not passed, it will follow the resizeMode.
parentLayoutX{ x: number; y: number; width: number; height: number; }Parent layout of image modal to hide overflow of image.
animationDurationXnumberDuration of animation. Default is 100ms.
hideCloseButtonXbooleanhide hide the default close button
onLongPressOriginImageX() => voidlong press event callback for the original image
renderHeaderX(close: () => void) => ReactNodeYou can customize the header of the full size modal with react native components
renderFooterX(close: () => void) => ReactNodeYou can customize the footer of the full size modal with react native components
renderImageComponentX({ source: ImageSourcePropType, style?: StyleProp<ImageStyle>, resizeMode?: ImageResizeMode}) => ReactNodeYou can customize the footer of the full size modal with react native components
isRTLXbooleanYou can use this library with right-to-left-devices. (#35)
onTapX(eventParams: {locationX: number; locationY: number; pageX: number; pageY: number;}) => voidone tap event callback for the full size modal
onDoubleTapX() => voiddouble tap event callback for the full size modal
onLongPressX() => voidlong press event callback for the full size modal
onOpenX() => voidopen event callback for the full size modal
didOpenX() => voidevent callback after open for the full size modal
onMoveX(position: {type: string; positionX: number; positionY: number; scale: number; zoomCurrentDistance: number;}) => voidmove event callback for the full size modal
responderReleaseX(vx?: number, scale?: number) => voidresponder release event callback for the full size modal
willCloseX() => voidevent callback before close for the full size modal
onCloseX() => voidclose event callback for the full size modal

Demo

open and close image modal

pinch zoom in/out and move

double tap zoom in/out

swipe to dismiss

customize the component

Example code

You can see the example code and demo.

Clone the repository

git clone https://github.com/dev-yakuza/react-native-image-modal.git

Install libraries

cd Example
npm install

# iOS
cd ios
pod install

Execute the example project.

# Example folder
# iOS
npm run ios
# Android
npm run android

Contribute

You can follow below to contribute react-native-image-modal.

Clone the repository.

git clone https://github.com/dev-yakuza/react-native-image-modal.git

Install libraries.

npm install
npx lefthook install

Execute the following command to start the project.

npm start

Execute the Develop project via the commands below.

cd Develop
npm install

# android
npm run android

# ios
cd ios
pod install
cd ..
npm run ios