React Navigation - 标题的渐变颜色

IT技术 javascript reactjs react-native react-navigation node-modules
2021-05-01 04:42:37

我在 React Native 应用程序中使用 React Navigation,我想backgroundColor将标题更改为渐变,我发现有一个节点module:在 React Nativereact-native-linear-gradient中实现渐变。

我有这样的 Root StackNavigator

const Router = StackNavigator({

Login: {
    screen: Login,
    navigationOptions: ({navigation}) => ({
       headerTitle: <Text>SomeTitle</Text>
       headerLeft: <SearchAndAgent />,
       headerRight: <TouchableOpacity
        onPress={() => { null }
    </TouchableOpacity>,
    headerStyle: { backgroundColor: '#005D97' },
    }),
},
});

我可以像这样包裹TextView渐变:

<LinearGradient colors={['#3076A7', '#19398A']}><Text style={styles.title}>{title}</Text></LinearGradient>,

如何将标题背景包装在 中navigationOptions以使用该LinearGradientmodule?

我知道我可以创建一个自定义标题组件并使用它,但是当我这样做时,来自 React Navigation 的所有本机导航动画都不像两个路由之间的标题动画那样工作,所以它对我没有帮助。

感谢您的帮助!

4个回答

仅供参考,现在有了headerBackgroundprops就更容易了。

你可以有一个渐变标题只是这样做:

navigationOptions: {
  headerBackground: (
    <LinearGradient
      colors={['#a13388', '#10356c']}
      style={{ flex: 1 }}
      start={{x: 0, y: 0}}
      end={{x: 1, y: 0}}
    />
  ),
  headerTitleStyle: { color: '#fff' },
}

即使使用 SafeArea for IosX,此解决方案也能很好地工作

Mark P 的解决方案是正确的,但现在您需要定义 headerStyle 并在那里进行绝对定位:

navigationOptions: {
  header: props => <GradientHeader {...props} />,
  headerStyle: {
    backgroundColor: 'transparent',
    position: 'absolute',
    top: 0,
    left: 0,
    right: 0,
    bottom: 0,
  },
},

和 GradientHeader:

const GradientHeader = props => (
<View style={{ backgroundColor: '#eee' }}>
    <LinearGradient
      colors={['red', 'blue']}
      style={[StyleSheet.absoluteFill, { height: Header.HEIGHT }]}
    >
      <Header {...props} />
    </LinearGradient>
  </View>
)

类似这个问题:React Navigation;在标题中使用图像?

对于线性梯度,您只需执行 >

//imports

import { Image, StyleSheet, View } from 'react-native';
import { Header } from 'react-navigation' ;
import LinearGradient from 'react-native-linear-gradient';

//header

创建包裹在线性渐变中的 Header 组件。通过制作标题,backgroundColor: 'transparent'您将显示包装它的线性渐变。

const GradientHeader = props => (
  <View style={{ backgroundColor: '#eee' }}>
    <LinearGradient
      colors={['#00a8c3', '#00373f']}
      style={[StyleSheet.absoluteFill, styles.linearGradient]}
    />
    <Header {...props} style={{ backgroundColor: 'transparent' }}/>
  </View>
);

返回屏幕,标题是您的GradientHeader组件。

const SimpleStack = StackNavigator({
  Home: {
    screen: MyHomeScreen,
  },
}, {
  navigationOptions: {
    headerTitleStyle: { color: '#fff' },
    header: (props) => <GradientHeader {...props} />,
  }
});

上面的代码应该看起来像这样。

渐变标题

您可以使用LinearGradient博览会中的组件。它是一个有用的组件,你不能安装另一个库,比如 react-native-linear-gradient。https://docs.expo.io/versions/latest/sdk/linear-gradient/顺便说一下,您可以更改后退按钮。这很容易。

您可以使用导航选项在内部屏幕上实现它

static navigationOptions = ({ navigation }: any) => {
  const onGoBack = () => navigation.goBack();
  return {
    header: (props: any) => <GradientHeader {...props} />,
    headerStyle: { height: 68, backgroundColor: "transparent", color: colors.white },
    headerTitle: "Sign Up",
    headerTitleStyle: { color: colors.white, fontSize: 18 },
    headerLeft: (
      <TouchableOpacity style={{ width: 32, height: 32, paddingLeft: 8 }} onPress={onGoBack}>
        <Image source={images.back} resizeMode="center" style={{ width: 32, height: 32 }} />
      </TouchableOpacity>
    ),
  };
};