如何在 React Native 中使用 Animated API 同时隐藏 Header 和 Footer

Posted

技术标签:

【中文标题】如何在 React Native 中使用 Animated API 同时隐藏 Header 和 Footer【英文标题】:How to hide Header and Footer at the same time with the Animated API in React Native 【发布时间】:2021-03-22 01:07:35 【问题描述】:

我只是想知道如何以相同的动画值同时隐藏页眉和页脚?

因为我认为我不能同时为动画多个组件使用相同的动画值。

我的组件

<SafeAreaView style= flex: 1 >
            <Animated.View
                style=
                    transform: [ translateY ],
                    position: "absolute",
                    top: 0,
                    left: 0,
                    zIndex: 100,
                    width: "100%",
                
            >
                <MainHeader logo="socialLogo" navigation=navigation />
            </Animated.View>
            <Animated.FlatList
                ref=ref
                onEndReachedThreshold=0.5
                contentContainerStyle= paddingTop: HEADER_HEIGHT 
                bounces=false
                onScroll=handleScroll
                nestedScrollEnabled=true
                ListHeaderComponent=<Stories data=data app=app />
                pinchGestureEnabled=false
                ListEmptyComponent=<FeedItemLazy />
                onMomentumScrollEnd=handleSnap
                scrollEventThrottle=16
                renderScrollComponent=(props) => <ScrollView ...props />
                showsVerticalScrollIndicator=false
                maxToRenderPerBatch=10
                onEndReached=() => 
                    props.social.getFeeds.executeNext( lastID: lastId );
                
                refreshControl=
                    <RefreshControl
                        refreshing=isRefreshing
                        onRefresh=handleRefresh
                    />
                
                data=data
                renderItem=( item, index ) => (
                    <>
                        <FeedItem
                            data=item
                            app=app
                            navigation=navigation
                            social=social
                        />
                        <Separator height=2 />
                    </>
                )
                keyExtractor=(item) => item._id
            />
            social.getFeeds.isExecuting && (
                <LottieView
                    source=require("../../../../assets/animation/16337-banana-loader.json")
                    loop
                    autoPlay
                    style= width: 50, height: 50 
                />
            )
            <ModalSelector navigation=navigation />
        </SafeAreaView>

这是一个 Feed 组件。平面列表中列出了用户提要,我的目标是当用户向下滚动时,使 MainHeader 和 Bottom 选项卡可折叠。我认为最难的部分是让底部标签不可见,因为它们直接来自react-navigation v5。来自createBottomTabNavigator。我不知道如何将translateY 值转移到标签导航器。

【问题讨论】:

你可以使用相同的值。 【参考方案1】:
import React from 'react';
import 
  Animated,
  Easing,
  Button,
  View,
  StyleSheet,
  Text,
  TouchableOpacity,
 from 'react-native';

const App = () => 
  const animatedValue = React.useRef(new Animated.Value(0)).current;
  const [hidden, setHidden] = React.useState(false);

  const startAnimation = (toValue) => 
    Animated.timing(animatedValue, 
      toValue: hidden ? 0 : 1,
      duration: 700,
      easing: Easing.linear,
      useNativeDriver: true,
    ).start(() => setHidden(!hidden));
  ;

  const translateY = animatedValue.interpolate(
    inputRange: [0, 1],
    outputRange: [0, -50],
    extrapolate: 'clamp',
  );

  return (
    <View style= flex: 1 >
      <Animated.View
        style=[styles.item,  top: 0, transform: [ translateY ] ]
      />
      <TouchableOpacity
        style=styles.button
        onPress=startAnimation.bind(null, 1 - animatedValue.__value)>
        <Text>Hide</Text>
      </TouchableOpacity>
      <Animated.View
        style=[
          styles.item,
          
            bottom: 0,
            transform: [ translateY: Animated.multiply(translateY, -1) ],
          ,
        ]
      />
    </View>
  );
;

const styles = StyleSheet.create(
  item: 
    width: '100%',
    height: 50,
    position: 'absolute',
    backgroundColor: 'red',
  ,
  button: 
    width: '50%',
    height: 50,
    backgroundColor: 'pink',
    justifyContent: 'center',
    alignItems: 'center',
    alignSelf: 'center',
    borderRadius: 25,
    position: 'absolute',
    top: 200,
  ,
);

export default App;

直播Demo.

【讨论】:

这不是我想要的,但帮助我达到了我想要的程度。谢谢 Gonsadze,我怎么能用 diffClamp 和滚动事件而不是点击做同样的伎俩? 明天再写,这里已经很晚了。 编辑了描述 要隐藏页眉吗?

以上是关于如何在 React Native 中使用 Animated API 同时隐藏 Header 和 Footer的主要内容,如果未能解决你的问题,请参考以下文章

如何在React Native中使用CreateBottomTabNavigator?

如何在 React Native 中的循环中查找

如何在 react-native 中使用 FormData?

如何使用 React-Native 在 iOS 中禁用屏幕截图

React Native:如何使用 expo 在 webview 中制作全屏 youtube 嵌入视频(没有 react-native 链接)

如何在组件 React / React-native 的单独页面中使用动态 graphql(字符串)