import React, {useEffect} from 'react'; import {LayoutRectangle, StyleSheet, View, Image} from 'react-native'; import {GestureDetector, FlatList} from 'react-native-gesture-handler'; import {SimultaneousGesture} from 'react-native-gesture-handler/lib/typescript/handlers/gestures/gestureComposition'; import Animated, { SharedValue, interpolate, useAnimatedStyle, withTiming, } from 'react-native-reanimated'; import {screenHeight, screenWidth} from '../responsive'; interface Props { measureImage: LayoutRectangle | undefined; valueAnimatedItem: SharedValue; gesture: SimultaneousGesture; offSet: SharedValue; scaleOffset: SharedValue; isPressed: SharedValue; scrollRef: any; data: any[]; onScroll: (number: number) => void; currentIndex: number | undefined; } const ItemAnimated: React.FC = ({ measureImage, valueAnimatedItem, gesture, offSet, scaleOffset, isPressed, scrollRef, data, onScroll, currentIndex, }) => { useEffect(() => { valueAnimatedItem.value = withTiming(1, {duration: 500}); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return ( <> ({ length: screenWidth, offset: screenWidth * index, index, })} onScroll={e => { onScroll( Math.floor(e.nativeEvent.contentOffset.x / (screenWidth - 10)), ); }} data={data} renderItem={({item, index}) => { return ( ); }} keyExtractor={item => item.index ? item.index.toString() : item.id.toString() } /> ); }; export default ItemAnimated; interface PropsChild { item: any; measureImage: LayoutRectangle | undefined; valueAnimatedItem: SharedValue; offSet: SharedValue; scaleOffset: SharedValue; isActive: boolean; isPressed: SharedValue; index: number; currentIndex: number | undefined; } const ChildItem: React.FC = ({ valueAnimatedItem, measureImage, offSet, scaleOffset, item, isActive, }) => { const rContainerImageView = useAnimatedStyle(() => { if (!measureImage) { return {}; } if (!isActive) { return { top: 0, left: 0, height: screenHeight, width: screenWidth, transform: [ {translateY: 0}, { scale: 1, }, ], }; } return { top: interpolate(valueAnimatedItem.value, [0, 1], [measureImage?.y, 0]), left: interpolate(valueAnimatedItem.value, [0, 1], [measureImage?.x, 0]), height: interpolate( valueAnimatedItem.value, [0, 1], [measureImage?.height, screenHeight], ), width: interpolate( valueAnimatedItem.value, [0, 1], [measureImage?.width, screenWidth], ), transform: [ {translateY: offSet.value}, { scale: scaleOffset.value !== 1 ? scaleOffset.value : interpolate(Math.abs(offSet.value), [0, 200], [1, 0.6]), }, ], }; }); return ( ); }; const style = StyleSheet.create({ flex1: { flex: 1, }, imgModalContainer: { flex: 1, resizeMode: 'contain', }, oer: { flex: 1, width: screenWidth, height: screenHeight, }, });