前几天在写一个功能时遇到一个 UI 需求,实现一个很花里胡哨的圆角遮罩大致的效果如下:

花里胡哨的界面之 React Native 写一个不同的圆角遮罩-天真的小窝

实际上不难,首先把两个圆角分析一下,需要实现两个圆角的话我们每个圆角要上下两层,背景层和圆角遮罩层,两个圆角遮罩刚好相反,一个是纯色遮罩一个是图片遮罩,我这里画了一张简单的示意图

花里胡哨的界面之 React Native 写一个不同的圆角遮罩-天真的小窝

我分成 4 层,每一层利用遮盖以及圆角露出的实现来创造出一种线型圆角的样式

花里胡哨的界面之 React Native 写一个不同的圆角遮罩-天真的小窝

然后 4 个图层依次覆盖,主要是控制好图层 3 的显示,把思路整理清楚就好办了。

直接看看我实现的代码吧:

import React from 'react';
import { StyleSheet, Text, View, Image } from 'react-native';

const index = () => {
    const radius = 45;
    const imageUrl = 'http://cos.haxibiao.com/images/5e82cbdd6f8f1.png';
    const imageStyle = {
        height: 250,
        width: Device.width,
        backgroundColor: '#19F',
        borderBottomRightRadius: radius,
    };

    return (
        <View style={{}}>
            <Image blurRadius={1} source={{ uri: imageUrl }} style={imageStyle} />
            <View
                style={{
                    height: radius,
                    width: Device.width,
                    backgroundColor: '#FFF',
                    borderTopLeftRadius: radius,
                    position: 'absolute',
                    bottom: 0,
                }}
            />

            <View style={{ backgroundColor: '#FFF', position: 'absolute', bottom: radius }}>
                <Image blurRadius={1} source={{ uri: imageUrl }} style={imageStyle} />
            </View>

            <View style={{ position: 'absolute', bottom: radius, marginBottom: 20, marginLeft: 20 }}>
                <View>
                    <Text style={{ color: '#FFF', fontWeight: 'bold', fontSize: 20 }}>04</Text>
                </View>
            </View>
        </View>
    );
};

export default index;

const styles = StyleSheet.create({});

好了,今天的划水文就到这里结束了…