如何仅对当前可见的项目进行动画处理,而不是 FlatList 水平分页中的其他隐藏项目
How to animate only the currently visible item, instead of other hidden items in FlatList horizontal pagination
目前,使用 FlatList 通过水平分页呈现项目,一次只有一个视图在屏幕上可见,但是当我将 'Animated.View' 传递到 FlatList 的 [renderItem] 时,只要当前可见的项目是单击动画,它还会在后台为所有其他隐藏视图设置动画,以优化性能,我尝试如下分配唯一引用
//renderItem
const Slide = ({item, index}) => {
const paginatedRefs = {}; //adding an object since we need more than one ref({})
//Animated.View here is using -import 'Animated' from react-native
return (
<View
ref={(ref) => (
(paginatedRefs.current[item.id] = ref),
console.log(paginatedRefs[item.id], item.id)
)}>
<Animated.View
style={[
animatedStyles.hidden,
rotateFront, //interpolated settings
]}>
<FlipCard inputRef={frontRef} item={item} />
</Animated.View>
<Animated.View
style={[
[
animatedStyles.hidden,
animatedStyles.back,
rotateBack, //interpolated settings
],
]}>
<FlipCard inputRef={backRef} item={item} />
</Animated.View>
<View>
<Text onPress={doAFlip}>Flip</Text>
</View>
</View>
);
我现在的问题是如何在当前可见项上动态设置 'rotateFront/rotateBack' 的样式,或者是否有更有效的替代方法来使用 'function components'
来解决此问题
//function that detects the currently visible item
const updateCurrentSlideIndex = (e) => {
//const contentOffsetY = e.nativeEvent.contentOffset.y;
const contentOffsetX = e.nativeEvent.contentOffset.x;
const currentIndex = Math.round(contentOffsetX / width);
setCurrentSlideIndex(currentIndex);
console.log('current slide', currentIndex);
//***********
//trying to link dynamic styling on the currently visible item for individual animation
//***********
//paginatedRefs.current.setNativeProps({});
//let nameOfRef = paginatedRefs.current.getAttribute("data-name");
};
另外,这是FlatList的配置
<View style={styles.bodyContainer}>
<ScrollView ref={refScroll}>
<FlatList
ref={ref}
data={slides}
keyExtractor={(item, index) => item.id}
renderItem={_renderItem}
pagingEnabled={true}
horizontal={true}
onMomentumScrollEnd={updateCurrentSlideIndex}
showsHorizontalScrollIndicator={false}
contentContainerStyle={styles.bodyScrollView}
/>
</ScrollView>
</View>
提前致谢
我从你的问题中得到的是,当用户点击 Flatlist 的 renderItem 中的视图时,你想为它设置动画。如果是这样,您需要将渲染项制作为 React 组件并在其中创建 ref,当您在组件内使用 ref 调用动画时,它将为唯一可见的项目设置动画。这是一个例子
const Slide = ({item,index})=> {
const ref = useRef(null);
return (<Animated.View ref = {ref}>
<TouchableOpacity onPress = {()=> {ref.current.animate....}}>
...
</TouchableOpacity>
</Animated.View>
}
因为 Flatlist 期望 renderItem 是一个函数,所以它不会接受 Slide,它是 React 组件,所以你需要做一些类似的事情
<Flatlist
renderItem = {(props)=> <Slide {...props}/>}
..../>
目前,使用 FlatList 通过水平分页呈现项目,一次只有一个视图在屏幕上可见,但是当我将 'Animated.View' 传递到 FlatList 的 [renderItem] 时,只要当前可见的项目是单击动画,它还会在后台为所有其他隐藏视图设置动画,以优化性能,我尝试如下分配唯一引用
//renderItem
const Slide = ({item, index}) => {
const paginatedRefs = {}; //adding an object since we need more than one ref({})
//Animated.View here is using -import 'Animated' from react-native
return (
<View
ref={(ref) => (
(paginatedRefs.current[item.id] = ref),
console.log(paginatedRefs[item.id], item.id)
)}>
<Animated.View
style={[
animatedStyles.hidden,
rotateFront, //interpolated settings
]}>
<FlipCard inputRef={frontRef} item={item} />
</Animated.View>
<Animated.View
style={[
[
animatedStyles.hidden,
animatedStyles.back,
rotateBack, //interpolated settings
],
]}>
<FlipCard inputRef={backRef} item={item} />
</Animated.View>
<View>
<Text onPress={doAFlip}>Flip</Text>
</View>
</View>
);
我现在的问题是如何在当前可见项上动态设置 'rotateFront/rotateBack' 的样式,或者是否有更有效的替代方法来使用 'function components'
来解决此问题//function that detects the currently visible item
const updateCurrentSlideIndex = (e) => {
//const contentOffsetY = e.nativeEvent.contentOffset.y;
const contentOffsetX = e.nativeEvent.contentOffset.x;
const currentIndex = Math.round(contentOffsetX / width);
setCurrentSlideIndex(currentIndex);
console.log('current slide', currentIndex);
//***********
//trying to link dynamic styling on the currently visible item for individual animation
//***********
//paginatedRefs.current.setNativeProps({});
//let nameOfRef = paginatedRefs.current.getAttribute("data-name");
};
另外,这是FlatList的配置
<View style={styles.bodyContainer}>
<ScrollView ref={refScroll}>
<FlatList
ref={ref}
data={slides}
keyExtractor={(item, index) => item.id}
renderItem={_renderItem}
pagingEnabled={true}
horizontal={true}
onMomentumScrollEnd={updateCurrentSlideIndex}
showsHorizontalScrollIndicator={false}
contentContainerStyle={styles.bodyScrollView}
/>
</ScrollView>
</View>
提前致谢
我从你的问题中得到的是,当用户点击 Flatlist 的 renderItem 中的视图时,你想为它设置动画。如果是这样,您需要将渲染项制作为 React 组件并在其中创建 ref,当您在组件内使用 ref 调用动画时,它将为唯一可见的项目设置动画。这是一个例子
const Slide = ({item,index})=> {
const ref = useRef(null);
return (<Animated.View ref = {ref}>
<TouchableOpacity onPress = {()=> {ref.current.animate....}}>
...
</TouchableOpacity>
</Animated.View>
}
因为 Flatlist 期望 renderItem 是一个函数,所以它不会接受 Slide,它是 React 组件,所以你需要做一些类似的事情
<Flatlist
renderItem = {(props)=> <Slide {...props}/>}
..../>