Last active
August 17, 2020 14:01
-
-
Save terrysahaidak/867e7be367e026ec84083860d8a92619 to your computer and use it in GitHub Desktop.
This file contains 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 React from 'react'; | |
import Animated, { | |
useAnimatedGestureHandler, | |
useSharedValue, | |
useAnimatedStyle, | |
useDerivedValue, | |
} from 'react-native-reanimated'; | |
import { View, Dimensions } from 'react-native'; | |
import { PanGestureHandler } from 'react-native-gesture-handler'; | |
export default function App() { | |
const translateX = useSharedValue(0); | |
function onTranslateXChange(value: number) { | |
'worklet'; | |
translateX.value = value; | |
} | |
return ( | |
<View style={{ flex: 1, justifyContent: 'center' }}> | |
<Pager onTranslateXChange={onTranslateXChange} /> | |
<View style={{ height: 60 }} /> | |
<MimicPager translateX={translateX} /> | |
</View> | |
); | |
} | |
type PagerProps = { | |
onTranslateXChange: (nextValue: number) => void; | |
}; | |
function Pager({ onTranslateXChange }: PagerProps) { | |
const offsetX = useSharedValue(0); | |
const pagerX = useSharedValue(0); | |
const actualTranslateX = useDerivedValue(() => { | |
const nextValue = offsetX.value + pagerX.value; | |
onTranslateXChange(nextValue); | |
return nextValue; | |
}); | |
const styles = useAnimatedStyle(() => ({ | |
flexDirection: 'row', | |
transform: [{ translateX: actualTranslateX.value }], | |
})); | |
const handler = useAnimatedGestureHandler({ | |
onActive: (evt) => { | |
pagerX.value = evt.translationX; | |
}, | |
onEnd: () => { | |
offsetX.value += pagerX.value; | |
pagerX.value = 0; | |
}, | |
}); | |
return ( | |
<PanGestureHandler onGestureEvent={handler}> | |
<Animated.View style={styles}>{renderPages()}</Animated.View> | |
</PanGestureHandler> | |
); | |
} | |
type MimicPagerProps = { | |
translateX: Animated.SharedValue<number>; | |
}; | |
function MimicPager({ translateX }: MimicPagerProps) { | |
const styles = useAnimatedStyle(() => ({ | |
flexDirection: 'row', | |
transform: [{ translateX: translateX.value }], | |
})); | |
return ( | |
<Animated.View style={styles}>{renderPages()}</Animated.View> | |
); | |
} | |
const colors = ['red', 'green', 'blue']; | |
function Page({ color }: { color: string }) { | |
return ( | |
<View | |
style={{ | |
backgroundColor: color, | |
width: Dimensions.get('window').width, | |
height: 200, | |
}} | |
/> | |
); | |
} | |
function renderPages() { | |
return colors.map((item) => <Page key={item} color={item} />); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment