Skip to content

πŸ” A view component for React Native with pinch to zoom and drag to pan functionality.

License

Notifications You must be signed in to change notification settings

fakeheal/react-native-pan-pinch-view

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

24 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

react-native-pan-pinch-view

npm (scoped)

A view component for React Native with pinch to zoom and drag to pan functionality.

iOS Example App Gif Android Example App Gif

πŸ‘‹ Introduction

Even though the demo shows the library used with images, it was initially designed to show <View>s representing blueprints of rooms.

  • Pinch to zoom with two fingers
  • Drag one finger to pan
  • Keep content inside container boundaries
  • Configurable minimum and maximum scale
  • Methods for programmatically updating position and scale

Thanks to react-native-reanimated all animations are running on the UI thread, so no fps drops are experienced.

If you want to zoom in on images exclusively, in a gallery-like UI, I recommend these packages, rather than my library:

πŸ‘€ Prerequisites

This library uses react-native-reanimated v3 and the latest API of react-native-gesture-handler.

Before installing it, you need to install those two libraries and set them up in your project:

βš™οΈ Installation

npm install react-native-pan-pinch-view

βœ‚οΈ Usage

import PanPinchView from "react-native-pan-pinch-view";

// ...

const CONTAINER = {
  width: 300,
  height: 300,
};

const CONTENT = {
  width: 900,
  height: 400,
};
// ...

<PanPinchView
  minScale={1}
  initialScale={1}
  containerDimensions={{
    width: CONTAINER.width,
    height: CONTAINER.height,
  }}
  contentDimensions={{ width: CONTENT.width, height: CONTENT.height }}
>
  <Image
    style={[styles.image]}
    source={require('./assets/photo.jpg')}
  />
</PanPinchView>

// ...

const styles = StyleSheet.create({
  image: {
    width: CONTENT.width,
    height: CONTENT.height,
  },
});

βšͺ Props

Property Type Default Description
containerDimensions Object {width: number, height:number} Width and height of the viewable area.
contentDimensions Object {width: number, height:number} Width and height of the zoomable view.
minScale Number? 0.5 Minimum value of scale.
maxScale Number? 4 Maximum value of scale.
initialScale Number? 1 Initial value of scale.
onTranslationFinished Function? undefined Function to be called on the JS thread with an object containing current position and whether it was clamped (X/Y)

πŸ›  Methods

Method Params Return Description
scaleTo value: number, animated: boolean void Sets sharedValue scale to value,
if animated is true uses withTiming
setContentSize width: number, height: number void Updates sharedValue contentSize and overrides prop: contentDimensions
translateTo x: number, y: number, animated: boolean void Updates content translateX / translateY,
if animated is true uses withTiming
setMinScale value: number void Updates minScale value
setMaxScale value: number void Updates maxScale value
getScale number Returns current value of sharedValue scale

You can also refer to the app inside example/ for a running demo of this library.

Contributing

See the contributing guide to learn how to contribute to the repository and the development workflow.

License

MIT