reactjs 如何在React-Native React Navigation 5中制作一个从透明到不透明颜色的标题动画?

sgtfey8w  于 2023-10-17  发布在  React
关注(0)|答案(3)|浏览(122)

我正在尝试在React-Native React Navigation 5中使用向下滚动时,使标题从透明变为不透明的固体颜色。
滚动到一半时开始过渡到不透明

达到最大偏移量时完全不透明

qrjkbowd

qrjkbowd1#

您可以通过将标题样式不透明度设置为动画值来执行此操作。
首先定义动画值,我们将插值yOffset以获得所需的不透明度。

const yOffset = useRef(new Animated.Value(0)).current;
const headerOpacity = yOffset.interpolate({
  inputRange: [0, 200],
  outputRange: [0, 1],
  extrapolate: "clamp",
});

然后你想要附加一个动画.事件监听器到一个动画滚动视图

<Animated.ScrollView
  onScroll={Animated.event(
    [
      {
        nativeEvent: {
          contentOffset: {
            y: yOffset,
          },
        },
      },
    ],
    { useNativeDriver: true }
  )}
  scrollEventThrottle={16}
>

您的内容应该在滚动视图中
在你的屏幕上添加一个挂载或使用效果,你设置animatedValue作为标题不透明度

useEffect(() => {
  navigation.setOptions({
    headerStyle: {
      opacity: headerOpacity,
    },
    headerBackground: () => (
      <Animated.View
        style={{
          backgroundColor: "white",
          ...StyleSheet.absoluteFillObject,
          opacity: headerOpacity,
        }}
      />
    ),
    headerTransparent: true,
  });
}, [headerOpacity, navigation]);

我使用了标题透明和标题背景,这样背景组件也会改变。
下面是一个示例:
https://snack.expo.io/@dannyhw/react-navigation-animated-header

xfyts7mz

xfyts7mz2#

const handleScroll = () => {
  YourElementRef.current.style.backgroundColor = `rgba(245, 245, 245, ${window.scrollY > 300 ? 1 : '0.' + (window.scrollY * 3)})`;
}
window.addEventListener('scroll', handleScroll, true);

您需要添加滚动侦听器和调用函数来使其动画化。scroll元素由ref stuff表示。例如

const YourElementRef = React.useRef(null);
<SomeElement ref={YourElementRef}...
zyfwsgd6

zyfwsgd63#

我按照Danny的回答成功地实现了标题动画。
我想分享我的解决方案,实现标题的动画
1.将Animated.Header绕在Text组件周围(文本将成为页眉标题):

useEffect(() => {
 navigation.setOptions({
   title: "", 
   headerStyle: {
     opacity: headerOpacity,
   },
   headerBackground: () => (
     <Animated.View
       style={{
         backgroundColor: "white",
         ...StyleSheet.absoluteFillObject,
         opacity: headerOpacity,
       }}
     >
       <Text style={styles.headerTitle}>This is the Title</Text>
     </Animated.View>
   ),
   headerTransparent: true,
 });
 }, [headerOpacity, navigation]);

1.使用这些样式来模仿原生iOS标题样式:

const styles = StyleSheet.create({
 headerTitle: {
   fontSize: 17,
   fontWeight: "600",
   bottom: 12,
   textAlign: "center",
   flex: 1,
   position: "absolute",
   width: "100%",
 }, 
 })

相关问题