Last active
February 3, 2020 11:18
-
-
Save hyochan/4c2d21fbcf8f3dfbc3b353fca88e0c8a to your computer and use it in GitHub Desktop.
React Native PinchZoomView
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import { | |
PanGestureHandler, | |
PanGestureHandlerGestureEvent, | |
PinchGestureHandler, | |
PinchGestureHandlerStateChangeEvent, | |
State, | |
} from 'react-native-gesture-handler'; | |
import React, { ReactChildren, ReactElement } from 'react'; | |
import { Animated } from 'react-native'; | |
import styled from 'styled-components/native'; | |
const Container = styled.View` | |
flex: 1; | |
background-color: transparent; | |
flex-direction: row; | |
align-items: center; | |
justify-content: center; | |
`; | |
interface Props { | |
children?: ReactChildren; | |
} | |
function PinchZoomVIew(): ReactElement { | |
const scale = new Animated.Value(1); | |
const translateX = new Animated.Value(0); | |
const translateY = new Animated.Value(0); | |
const onZoomEvent = Animated.event( | |
[ | |
{ | |
nativeEvent: { scale }, | |
}, | |
], | |
{ | |
useNativeDriver: true, | |
}, | |
); | |
const onZoomStateChange = (event: PinchGestureHandlerStateChangeEvent): void => { | |
const eventScale = event.nativeEvent.scale; | |
if (event.nativeEvent.oldState === State.ACTIVE) { | |
scale.setValue(eventScale); | |
Animated.event([{ | |
nativeEvent: { | |
scale, | |
}, | |
}], { useNativeDriver: true }); | |
} | |
}; | |
const onPanGestureEvent = (event: PanGestureHandlerGestureEvent): void => { | |
if (event.nativeEvent.numberOfPointers > 1) return; | |
translateX.setValue(event.nativeEvent.translationX); | |
translateY.setValue(event.nativeEvent.translationY); | |
Animated.event([{ | |
nativeEvent: { | |
translationX: translateX, | |
translationY: translateY, | |
}, | |
}], { useNativeDriver: true }); | |
}; | |
return <Container> | |
<PanGestureHandler onGestureEvent={onPanGestureEvent}> | |
<Animated.View> | |
<PinchGestureHandler | |
onGestureEvent={onZoomEvent} | |
onHandlerStateChange={onZoomStateChange}> | |
<Animated.View style={{ | |
height: '80%', | |
width: '100%', | |
justifyContent: 'center', | |
alignItems: 'center', | |
}}> | |
<Animated.Image | |
source={{ | |
uri: 'https://dooboolab.com/d7cdbf0713cfdb63d51d9d9a686c6d35.png', | |
}} | |
style={{ | |
minWidth: 300, | |
minHeight: 300, | |
transform: [ | |
{ translateX }, | |
{ translateY }, | |
{ scale }, | |
{ perspective: 200 }, | |
], | |
}} | |
resizeMode="contain" | |
/> | |
</Animated.View> | |
</PinchGestureHandler> | |
</Animated.View> | |
</PanGestureHandler> | |
</Container>; | |
} | |
export default PinchZoomVIew; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Note that this isn't working well in android.