React Native中两种方式实现渐变色

0 阅读3分钟

前言

使用RN开发的应用大部分是Android和iOS平台产物,如果开发web当然也可以,但是要知道三者间有诸多平台差异,就比如在渐变色的实现上。在web端你肯定知道配置background-image即可,但是在android和iOS则大不相同,在RN的样式中编写backgroundImage:'linear-gradent()'只能在web端生效。这是一个平台差异,而且实现的配置方式有诸多不同,废话不多说,直接看效果和方案:

微信图片_20260227150920_247_23.jpg 微信图片_20260227150921_248_23.jpg

微信图片_20260227150922_250_23.jpg 微信图片_20260227150923_251_23.jpg

方案1:expo-linear-gradient

如果你使用expo创建了RN项目,推荐使用expo-linear-gradient依赖库创建渐变效果。它提供了LinearGradient组件,并且该组件继承自View,特有如下属性:

export type LinearGradientProps = ViewProps & {
  colors: readonly [ColorValue, ColorValue, ...ColorValue[]];
  locations?: readonly [number, number, ...number[]] | null;
  start?: LinearGradientPoint | null;
  end?: LinearGradientPoint | null;
  dither?: boolean;
};

也就是说相较View组件多了如上一个参数,colors就是颜色值组成的数组,locations是对应colors数组中颜色的位置,start和end是{x:number,y:number}形式的对象,用来控制渐变起点和终点位置,x y都是浮点数0~1范围,比如如下:

        <LinearGradient
            colors={['#fbecd4', '#f9b960']}
            start={{ x: 0, y: 0 }}
            end={{ x: 1, y: 1 }}
            style={styles.topCard}
        />

很简单,start的x y均为0表示从元素的左上角作为起点,如果y值大于0则是向下移动,x大于0则是向右移动,end也是同道理,locations可以不设置,设置的话要和colors的数组元素数量一致,表示控制颜色的位置。

存在的问题

1.设置圆角需要使用overflow:hidden控制,否则会溢出导致圆角不生效。

2.只支持线性渐变(本身人家组件就是线性渐变),如果需要径向渐变可能需要其他依赖库,装一堆依赖库应该也是挺烦的

方案2:RN自带的渐变方案

RN具体在哪个版本中开始增加了View组件(包括继承自View组件的组件,比如Pressable等)添加了experimental_backgroundImage属性,我也不清楚,它的使用方式极为简单

        <TouchableOpacity
            style={styles.box}
        >
        ...
            box: {
        marginTop: 100,
        width: 200,
        height: 300,
        borderRadius:10,
        experimental_backgroundImage: 'linear-gradient(135deg, #ffffc4 0.000%, #ff6164 50.000%, #b00012 100.000%)'
    },  
        

除了线性渐变它还支持径向渐变:radial-gradient(#ccc, red, blue),但是它不支持conic-gradient渐变。experimental_backgroundImage的编写方式和CSS一样,这对于前端er比较友好。 但是要注意:experimental表示实验性,如果你的产物要在生产环境使用推荐方案1!目前我只是简单测试了experimental_backgroundImage,它不需要overflow:hidden辅助圆角显示,bug情况我也不是很清楚。

至于指定页面的主题渐变色配置逻辑很清晰,最麻烦的是配色和配色的名称,切换设置都很简单,代码我就不贴了, 渐变色可以去网上找,安利一个渐变色网站,有很多渐变资源,直接复制。具体的项目细节可以查看[gitee仓库](expo rn: expo创建的react native的音乐播放器应用,专注视频转歌和本地歌曲播放)