在这里插入图片描述

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net

📋 前言

@react-native-masked-view/masked-view 是一个强大的遮罩视图组件库,它为 React Native 应用提供了遮罩效果实现能力,允许开发者使用一个视图作为遮罩,控制另一个视图的可见性。该库支持复杂的遮罩效果,包括文字遮罩、渐变遮罩、形状遮罩等,能够实现各种视觉效果,如文字渐变填充、图片渐变遮罩、形状裁剪等。该库支持 Android、iOS 和 HarmonyOS 三端,特别适合需要实现独特视觉效果的场景,如品牌 Logo、特殊形状按钮、渐变文字等。

🎯 库简介

基本信息
  • 库名称: @react-native-masked-view/masked-view

  • 版本信息:

    • 0.2.11: 支持 RN 0.72 版本(@react-native-ohos/masked-view)
    • 0.3.3: 支持 RN 0.77 版本(@react-native-ohos/masked-view)
  • 官方仓库: https://github.com/react-native-masked-view/masked-view

  • 主要功能:

    • 文字遮罩:使用文字作为遮罩,实现文字渐变填充效果
    • 渐变遮罩:使用渐变作为遮罩,实现平滑的淡入淡出效果
    • 形状遮罩:使用自定义形状作为遮罩,实现各种形状裁剪
    • 图片遮罩:使用图片作为遮罩,实现复杂的遮罩效果
    • 多层遮罩:支持多层嵌套遮罩,实现复杂效果
    • 性能优化:基于原生实现,性能优异
    • 跨平台:支持 Android、iOS、HarmonyOS 三端,统一的 API
  • 技术特点: 基于原生视图组件实现,提供跨平台统一的遮罩效果 API

  • 兼容性验证: 该第三方库支持直接从 npm 下载,新的包名为:@react-native-ohos/masked-view

为什么需要这个库?
  • 视觉效果: 实现独特的视觉效果,如渐变文字、形状裁剪等
  • 品牌定制: 支持品牌视觉定制,提升应用品质
  • 跨平台: 支持 Android、iOS、HarmonyOS 三端,统一的 API
  • 使用简单: API 设计简洁明了,易于集成和使用
  • 性能优异: 基于原生实现,性能优异
  • 场景丰富: 适用于 Logo、按钮、标题、背景等多种场景
  • 鸿蒙支持: 完整支持 HarmonyOS 平台,实现真正的跨平台

📦 安装步骤

1. 使用 npm 安装
npm install @react-native-ohos/masked-view@0.2.11-rc.1
2. 验证安装

安装完成后,检查 package.json 文件,应该能看到新增的依赖:

{
  "dependencies": {
    "@react-native-ohos/masked-view": "^0.2.11-rc.1",
    // ... 其他依赖
  }
}

🔧 HarmonyOS 平台配置 ⭐

1. 配置 overrides(必需步骤)⭐⭐⭐

[!WARNING] 必须在 harmony 工程根目录的 oh-package.json5 中添加 overrides 字段!

打开 harmony/oh-package.json5,添加:

{
  ...
  "overrides": {
    "@rnoh/react-native-openharmony": "0.72.90"
  }
}
2. 引入原生端代码

目前有两种方法:

方法一:通过 har 包引入(推荐)

[!TIP] har 包位于三方库安装路径的 harmony 文件夹下。

打开 harmony/entry/oh-package.json5,添加以下依赖:

"dependencies": {
    "@react-native-ohos/masked-view": "file:../../node_modules/@react-native-ohos/masked-view/harmony/masked_view.har"
}

点击右上角的 sync 按钮

或者在终端执行:

cd harmony/entry
ohpm install
方法二:直接链接源码

步骤 1: 把 <RN工程>/node_modules/@react-native-ohos/masked-view/harmony 目录下的源码 masked_view 复制到 harmony 工程根目录下。

步骤 2: 在 harmony 工程根目录的 build-profile.json5 添加以下模块:

modules: [
  ...
  {
    name: 'masked_view',
    srcPath: './masked_view',
  }
]

步骤 3: 打开 masked_view/oh-package.json5,修改 @rnoh/react-native-openharmony 和项目的版本一致。

步骤 4: 打开 harmony/entry/oh-package.json5,添加以下依赖:

"dependencies": {
  "@rnoh/react-native-openharmony": "0.72.90",
  "@react-native-ohos/masked-view": "file:../masked_view"
}

步骤 5: 点击 DevEco Studio 右上角的 sync 按钮

3. 配置 CMakeLists 和引入 MaskedPackage

打开 harmony/entry/src/main/cpp/CMakeLists.txt,添加:

project(rnapp)
cmake_minimum_required(VERSION 3.4.1)
set(CMAKE_SKIP_BUILD_RPATH TRUE)
set(RNOH_APP_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
set(NODE_MODULES "${CMAKE_CURRENT_SOURCE_DIR}/../../../../../node_modules")
+ set(OH_MODULES "${CMAKE_CURRENT_SOURCE_DIR}/../../../oh_modules")
set(RNOH_CPP_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../react-native-harmony/harmony/cpp")
set(LOG_VERBOSITY_LEVEL 1)
set(CMAKE_ASM_FLAGS "-Wno-error=unused-command-line-argument -Qunused-arguments")
set(CMAKE_CXX_FLAGS "-fstack-protector-strong -Wl,-z,relro,-z,noexecstack -s -fPIE -pie")
set(WITH_HITRACE_SYSTRACE 1) # for other CMakeLists.txt files to use
add_compile_definitions(WITH_HITRACE_SYSTRACE)

add_subdirectory("${RNOH_CPP_DIR}" ./rn)

# RNOH_BEGIN: manual_package_linking_1
add_subdirectory("../../../../sample_package/src/main/cpp" ./sample-package)
+ add_subdirectory("${OH_MODULES}/@react-native-ohos/masked-view/src/main/cpp" ./masked-view)
# RNOH_END: manual_package_linking_1

file(GLOB GENERATED_CPP_FILES "./generated/*.cpp")

add_library(rnoh_app SHARED
    ${GENERATED_CPP_FILES}
    "./PackageProvider.cpp"
    "${RNOH_CPP_DIR}/RNOHAppNapiBridge.cpp"
)
target_link_libraries(rnoh_app PUBLIC rnoh)

# RNOH_BEGIN: manual_package_linking_2
target_link_libraries(rnoh_app PUBLIC rnoh_sample_package)
+ target_link_libraries(rnoh_app PUBLIC rnoh_masked_view)
# RNOH_END: manual_package_linking_2

打开 harmony/entry/src/main/cpp/PackageProvider.cpp,添加:

#include "RNOH/PackageProvider.h"
#include "generated/RNOHGeneratedPackage.h"
#include "SamplePackage.h"
+ #include "MaskedPackage.h"

using namespace rnoh;

std::vector<std::shared_ptr<Package>> PackageProvider::getPackages(Package::Context ctx) {
    return {
        std::make_shared<RNOHGeneratedPackage>(ctx),
        std::make_shared<SamplePackage>(ctx),
+       std::make_shared<MaskedPackage>(ctx),
    };
}
4. 运行

点击右上角的 sync 按钮

或者在终端执行:

cd harmony/entry
ohpm install

然后编译、运行即可。

💻 完整代码示例

下面是一个完整的示例,展示了如何使用 MaskedView 实现各种遮罩效果:

import React from 'react';
import {
  View,
  StyleSheet,
  Text,
  SafeAreaView,
  ScrollView,
  StatusBar,
  Dimensions,
} from 'react-native';
import MaskedView from '@react-native-masked-view/masked-view';
import { LinearGradient } from 'react-native-linear-gradient';

const { width } = Dimensions.get('window');

function MaskedViewDemo() {
  return (
    <SafeAreaView style={styles.container}>
      <StatusBar barStyle="dark-content" backgroundColor="#ffffff" />
    
      {/* 顶部导航栏 */}
      <View style={styles.header}>
        <Text style={styles.headerTitle}>遮罩视图演示</Text>
        <Text style={styles.headerSubtitle}>@react-native-masked-view/masked-view</Text>
      </View>

      <ScrollView style={styles.content}>
        {/* 文字渐变遮罩 */}
        <View style={styles.card}>
          <Text style={styles.cardTitle}>🎨 文字渐变遮罩</Text>
          <View style={styles.demoContainer}>
            <MaskedView
              style={styles.maskedView}
              maskElement={
                <View style={styles.maskContainer}>
                  <Text style={styles.maskedText}>GRADIENT</Text>
                </View>
              }
            >
              <LinearGradient
                colors={['#FF6B6B', '#4ECDC4', '#45B7D1']}
                start={{ x: 0, y: 0 }}
                end={{ x: 1, y: 0 }}
                style={styles.gradient}
              />
            </MaskedView>
            <MaskedView
              style={styles.maskedView}
              maskElement={
                <View style={styles.maskContainer}>
                  <Text style={styles.maskedTextLarge}>Masked</Text>
                </View>
              }
            >
              <LinearGradient
                colors={['#667eea', '#764ba2']}
                start={{ x: 0, y: 0 }}
                end={{ x: 1, y: 1 }}
                style={styles.gradient}
              />
            </MaskedView>
          </View>
        </View>

        {/* 彩虹文字遮罩 */}
        <View style={styles.card}>
          <Text style={styles.cardTitle}>🌈 彩虹文字遮罩</Text>
          <View style={styles.demoContainer}>
            <MaskedView
              style={styles.maskedView}
              maskElement={
                <View style={styles.maskContainer}>
                  <Text style={styles.maskedTextRainbow}>RAINBOW</Text>
                </View>
              }
            >
              <LinearGradient
                colors={['#FF0000', '#FF7F00', '#FFFF00', '#00FF00', '#0000FF', '#4B0082', '#9400D3']}
                start={{ x: 0, y: 0 }}
                end={{ x: 1, y: 0 }}
                style={styles.gradient}
              />
            </MaskedView>
          </View>
        </View>

        {/* 垂直渐变文字 */}
        <View style={styles.card}>
          <Text style={styles.cardTitle}>📊 垂直渐变文字</Text>
          <View style={styles.demoContainer}>
            <MaskedView
              style={styles.maskedView}
              maskElement={
                <View style={styles.maskContainer}>
                  <Text style={styles.maskedTextVertical}>VERTICAL</Text>
                </View>
              }
            >
              <LinearGradient
                colors={['#00c6ff', '#0072ff']}
                start={{ x: 0, y: 0 }}
                end={{ x: 0, y: 1 }}
                style={styles.gradient}
              />
            </MaskedView>
          </View>
        </View>

        {/* 斜向渐变文字 */}
        <View style={styles.card}>
          <Text style={styles.cardTitle}>↗️ 斜向渐变文字</Text>
          <View style={styles.demoContainer}>
            <MaskedView
              style={styles.maskedView}
              maskElement={
                <View style={styles.maskContainer}>
                  <Text style={styles.maskedTextDiagonal}>DIAGONAL</Text>
                </View>
              }
            >
              <LinearGradient
                colors={['#f093fb', '#f5576c']}
                start={{ x: 0, y: 0 }}
                end={{ x: 1, y: 1 }}
                style={styles.gradient}
              />
            </MaskedView>
          </View>
        </View>

        {/* 多色段渐变 */}
        <View style={styles.card}>
          <Text style={styles.cardTitle}>🎭 多色段渐变</Text>
          <View style={styles.demoContainer}>
            <MaskedView
              style={styles.maskedView}
              maskElement={
                <View style={styles.maskContainer}>
                  <Text style={styles.maskedTextSegments}>SEGMENTS</Text>
                </View>
              }
            >
              <LinearGradient
                colors={['#11998e', '#38ef7d', '#00b4db', '#0083b0']}
                locations={[0, 0.33, 0.66, 1]}
                start={{ x: 0, y: 0 }}
                end={{ x: 1, y: 0 }}
                style={styles.gradient}
              />
            </MaskedView>
          </View>
        </View>

        {/* 图标遮罩 */}
        <View style={styles.card}>
          <Text style={styles.cardTitle}>⭐ 图标遮罩</Text>
          <View style={styles.demoContainer}>
            <MaskedView
              style={styles.iconMaskedView}
              maskElement={
                <View style={styles.iconMaskContainer}>
                  <Text style={styles.iconMaskedText}></Text>
                </View>
              }
            >
              <LinearGradient
                colors={['#FFD700', '#FFA500']}
                start={{ x: 0, y: 0 }}
                end={{ x: 1, y: 1 }}
                style={styles.gradient}
              />
            </MaskedView>
            <MaskedView
              style={styles.iconMaskedView}
              maskElement={
                <View style={styles.iconMaskContainer}>
                  <Text style={styles.iconMaskedText}></Text>
                </View>
              }
            >
              <LinearGradient
                colors={['#FF6B6B', '#FF8E8E']}
                start={{ x: 0, y: 0 }}
                end={{ x: 1, y: 1 }}
                style={styles.gradient}
              />
            </MaskedView>
            <MaskedView
              style={styles.iconMaskedView}
              maskElement={
                <View style={styles.iconMaskContainer}>
                  <Text style={styles.iconMaskedText}></Text>
                </View>
              }
            >
              <LinearGradient
                colors={['#4FACFE', '#00F2FE']}
                start={{ x: 0, y: 0 }}
                end={{ x: 1, y: 1 }}
                style={styles.gradient}
              />
            </MaskedView>
          </View>
        </View>

        {/* 品牌 Logo 遮罩 */}
        <View style={styles.card}>
          <Text style={styles.cardTitle}>🏷️ 品牌 Logo 遮罩</Text>
          <View style={styles.demoContainer}>
            <MaskedView
              style={styles.logoMaskedView}
              maskElement={
                <View style={styles.logoMaskContainer}>
                  <Text style={styles.logoMaskedText}>BRAND</Text>
                </View>
              }
            >
              <LinearGradient
                colors={['#667eea', '#764ba2']}
                start={{ x: 0, y: 0 }}
                end={{ x: 1, y: 1 }}
                style={styles.gradient}
              />
            </MaskedView>
            <MaskedView
              style={styles.logoMaskedView}
              maskElement={
                <View style={styles.logoMaskContainer}>
                  <Text style={styles.logoMaskedText}>LOGO</Text>
                </View>
              }
            >
              <LinearGradient
                colors={['#f093fb', '#f5576c']}
                start={{ x: 0, y: 0 }}
                end={{ x: 1, y: 1 }}
                style={styles.gradient}
              />
            </MaskedView>
          </View>
        </View>

        {/* 多行文字遮罩 */}
        <View style={styles.card}>
          <Text style={styles.cardTitle}>📝 多行文字遮罩</Text>
          <View style={styles.demoContainer}>
            <MaskedView
              style={styles.multiLineMaskedView}
              maskElement={
                <View style={styles.multiLineMaskContainer}>
                  <Text style={styles.multiLineMaskedText}>
                    React Native
                    {'\n'}
                    HarmonyOS
                    {'\n'}
                    Cross Platform
                  </Text>
                </View>
              }
            >
              <LinearGradient
                colors={['#11998e', '#38ef7d', '#00b4db']}
                start={{ x: 0, y: 0 }}
                end={{ x: 1, y: 1 }}
                style={styles.gradient}
              />
            </MaskedView>
          </View>
        </View>

        {/* 使用说明 */}
        <View style={styles.card}>
          <Text style={styles.cardTitle}>💡 使用说明</Text>
          <Text style={styles.infoText}>• 文字渐变遮罩:使用文字作为遮罩,实现文字渐变填充效果</Text>
          <Text style={styles.infoText}>• 彩虹文字遮罩:使用彩虹色渐变,实现炫酷的视觉效果</Text>
          <Text style={styles.infoText}>• 垂直渐变文字:使用垂直渐变,实现上下渐变效果</Text>
          <Text style={styles.infoText}>• 斜向渐变文字:使用斜向渐变,实现对角渐变效果</Text>
          <Text style={styles.infoText}>• 多色段渐变:使用多个颜色段,实现分段渐变效果</Text>
          <Text style={styles.infoText}>• 图标遮罩:使用图标作为遮罩,实现渐变图标效果</Text>
          <Text style={styles.infoText}>• 品牌 Logo 遮罩:使用品牌名称作为遮罩,实现品牌 Logo 效果</Text>
          <Text style={styles.infoText}>• 多行文字遮罩:支持多行文字渐变效果</Text>
          <Text style={styles.infoText}>• 鸿蒙适配:所有效果在鸿蒙端完美兼容</Text>
        </View>

        {/* 技术说明 */}
        <View style={styles.card}>
          <Text style={styles.cardTitle}>🔧 技术说明</Text>
          <Text style={styles.infoText}>• MaskedView 组件需要配合 LinearGradient 使用</Text>
          <Text style={styles.infoText}>• maskElement 属性指定遮罩元素</Text>
          <Text style={styles.infoText}>• 子元素(通常是 LinearGradient)提供渐变效果</Text>
          <Text style={styles.infoText}>• 遮罩元素的透明区域会显示渐变效果</Text>
          <Text style={styles.infoText}>• 支持嵌套使用,实现复杂效果</Text>
          <Text style={styles.infoText}>• 性能优化:基于原生实现,性能优异</Text>
        </View>
      </ScrollView>
    </SafeAreaView>
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: '#F5F7FA',
  },
  header: {
    padding: 20,
    backgroundColor: '#FFFFFF',
    borderBottomWidth: 1,
    borderBottomColor: '#EBEEF5',
  },
  headerTitle: {
    fontSize: 24,
    fontWeight: '700',
    color: '#303133',
    textAlign: 'center',
    marginBottom: 8,
  },
  headerSubtitle: {
    fontSize: 16,
    fontWeight: '500',
    color: '#909399',
    textAlign: 'center',
  },
  content: {
    flex: 1,
    padding: 16,
  },
  card: {
    backgroundColor: '#FFFFFF',
    borderRadius: 12,
    marginBottom: 16,
    padding: 16,
    shadowColor: '#000000',
    shadowOffset: { width: 0, height: 2 },
    shadowOpacity: 0.08,
    shadowRadius: 8,
    elevation: 4,
  },
  cardTitle: {
    fontSize: 18,
    fontWeight: '600',
    color: '#303133',
    marginBottom: 12,
  },
  demoContainer: {
    backgroundColor: '#F5F7FA',
    borderRadius: 8,
    padding: 16,
    alignItems: 'center',
  },
  maskedView: {
    width: '100%',
    height: 60,
    marginBottom: 12,
  },
  maskContainer: {
    backgroundColor: 'transparent',
    alignItems: 'center',
    justifyContent: 'center',
    width: '100%',
    height: '100%',
  },
  maskedText: {
    fontSize: 48,
    fontWeight: 'bold',
    letterSpacing: 4,
  },
  maskedTextLarge: {
    fontSize: 56,
    fontWeight: '900',
    letterSpacing: 2,
  },
  maskedTextRainbow: {
    fontSize: 52,
    fontWeight: '800',
    letterSpacing: 3,
  },
  maskedTextVertical: {
    fontSize: 48,
    fontWeight: 'bold',
    letterSpacing: 3,
  },
  maskedTextDiagonal: {
    fontSize: 48,
    fontWeight: '800',
    letterSpacing: 2,
  },
  maskedTextSegments: {
    fontSize: 48,
    fontWeight: 'bold',
    letterSpacing: 2,
  },
  gradient: {
    flex: 1,
  },
  iconMaskedView: {
    width: 80,
    height: 80,
    marginHorizontal: 8,
  },
  iconMaskContainer: {
    backgroundColor: 'transparent',
    alignItems: 'center',
    justifyContent: 'center',
    width: '100%',
    height: '100%',
  },
  iconMaskedText: {
    fontSize: 64,
  },
  logoMaskedView: {
    width: '100%',
    height: 70,
    marginBottom: 12,
  },
  logoMaskContainer: {
    backgroundColor: 'transparent',
    alignItems: 'center',
    justifyContent: 'center',
    width: '100%',
    height: '100%',
  },
  logoMaskedText: {
    fontSize: 52,
    fontWeight: '900',
    letterSpacing: 2,
  },
  multiLineMaskedView: {
    width: '100%',
    height: 100,
  },
  multiLineMaskContainer: {
    backgroundColor: 'transparent',
    alignItems: 'center',
    justifyContent: 'center',
    width: '100%',
    height: '100%',
  },
  multiLineMaskedText: {
    fontSize: 28,
    fontWeight: 'bold',
    textAlign: 'center',
    lineHeight: 36,
  },
  infoText: {
    fontSize: 14,
    color: '#606266',
    lineHeight: 22,
    marginBottom: 6,
  },
});

export default MaskedViewDemo;

🎨 实际应用场景

完整示例代码已展示了以下实际应用场景:

  • 文字渐变遮罩: 使用文字作为遮罩,实现文字渐变填充效果
  • 彩虹文字遮罩: 使用彩虹色渐变,实现炫酷的视觉效果
  • 垂直渐变文字: 使用垂直渐变,实现上下渐变效果
  • 斜向渐变文字: 使用斜向渐变,实现对角渐变效果
  • 多色段渐变: 使用多个颜色段,实现分段渐变效果
  • 图标遮罩: 使用图标作为遮罩,实现渐变图标效果
  • 品牌 Logo 遮罩: 使用品牌名称作为遮罩,实现品牌 Logo 效果
  • 多行文字遮罩: 支持多行文字渐变效果

⚠️ 注意事项与最佳实践

1. 基础使用(文字渐变)

最常用的场景是文字渐变效果:

import MaskedView from '@react-native-masked-view/masked-view';
import { LinearGradient } from 'react-native-linear-gradient';

<MaskedView
  style={{ width: 200, height: 60 }}
  maskElement={
    <View style={{ backgroundColor: 'transparent', flex: 1, justifyContent: 'center', alignItems: 'center' }}>
      <Text style={{ fontSize: 48, fontWeight: 'bold' }}>GRADIENT</Text>
    </View>
  }
>
  <LinearGradient
    colors={['#FF6B6B', '#4ECDC4']}
    start={{ x: 0, y: 0 }}
    end={{ x: 1, y: 0 }}
    style={{ flex: 1 }}
  />
</MaskedView>
2. 遮罩元素注意事项

遮罩元素(maskElement)的透明区域决定可见区域:

// 正确:使用透明背景
maskElement={
  <View style={{ backgroundColor: 'transparent', alignItems: 'center' }}>
    <Text style={{ color: '#000' }}>Text</Text>
  </View>
}

// 错误:使用不透明背景
maskElement={
  <View style={{ backgroundColor: '#fff', alignItems: 'center' }}>
    <Text style={{ color: '#000' }}>Text</Text>
  </View>
}
3. 渐变方向配置

合理配置渐变方向,实现最佳视觉效果:

// 水平渐变(从左到右)
<LinearGradient
  colors={['#FF6B6B', '#4ECDC4']}
  start={{ x: 0, y: 0 }}
  end={{ x: 1, y: 0 }}
/>

// 垂直渐变(从上到下)
<LinearGradient
  colors={['#FF6B6B', '#4ECDC4']}
  start={{ x: 0, y: 0 }}
  end={{ x: 0, y: 1 }}
/>

// 斜向渐变(从左上到右下)
<LinearGradient
  colors={['#FF6B6B', '#4ECDC4']}
  start={{ x: 0, y: 0 }}
  end={{ x: 1, y: 1 }}
/>

// 对角渐变(从左下到右上)
<LinearGradient
  colors={['#FF6B6B', '#4ECDC4']}
  start={{ x: 0, y: 1 }}
  end={{ x: 1, y: 0 }}
/>
4. 多色渐变配置

使用多个颜色和位置实现复杂渐变:

// 多色渐变
<LinearGradient
  colors={['#FF0000', '#FF7F00', '#FFFF00', '#00FF00', '#0000FF', '#4B0082', '#9400D3']}
  start={{ x: 0, y: 0 }}
  end={{ x: 1, y: 0 }}
/>

// 分段渐变(指定颜色位置)
<LinearGradient
  colors={['#11998e', '#38ef7d', '#00b4db', '#0083b0']}
  locations={[0, 0.33, 0.66, 1]}
  start={{ x: 0, y: 0 }}
  end={{ x: 1, y: 0 }}
/>
5. 图标遮罩使用

使用图标作为遮罩,实现渐变图标效果:

<MaskedView
  style={{ width: 60, height: 60 }}
  maskElement={
    <View style={{ backgroundColor: 'transparent', alignItems: 'center', justifyContent: 'center' }}>
      <Text style={{ fontSize: 48 }}></Text>
    </View>
  }
>
  <LinearGradient
    colors={['#FFD700', '#FFA500']}
    start={{ x: 0, y: 0 }}
    end={{ x: 1, y: 1 }}
    style={{ flex: 1 }}
  />
</MaskedView>
6. 嵌套遮罩效果

可以嵌套使用 MaskedView,实现更复杂的效果:

<MaskedView
  style={{ width: 200, height: 60 }}
  maskElement={
    <View style={{ alignItems: 'center', justifyContent: 'center' }}>
      <Text style={{ fontSize: 48, fontWeight: 'bold' }}>OUTER</Text>
    </View>
  }
>
  <MaskedView
    style={{ width: 200, height: 60 }}
    maskElement={
      <View style={{ alignItems: 'center', justifyContent: 'center' }}>
        <Text style={{ fontSize: 48, fontWeight: 'bold' }}>INNER</Text>
      </View>
    }
  >
    <LinearGradient
      colors={['#667eea', '#764ba2']}
      start={{ x: 0, y: 0 }}
      end={{ x: 1, y: 1 }}
      style={{ flex: 1 }}
    />
  </MaskedView>
</MaskedView>
7. 性能优化建议

虽然 MaskedView 性能优异,但仍需注意以下优化点:

// ✅ 正确:避免在列表中频繁创建新的 MaskedView
const GradientText = memo(({ text, colors }) => (
  <MaskedView style={{ width: 200, height: 60 }} maskElement={...}>
    <LinearGradient colors={colors} start={{ x: 0, y: 0 }} end={{ x: 1, y: 0 }} />
  </MaskedView>
));

// ❌ 错误:在列表中每次都创建新的 MaskedView
const renderItem = ({ item }) => (
  <MaskedView style={{ width: 200, height: 60 }} maskElement={...}>
    <LinearGradient colors={item.colors} start={{ x: 0, y: 0 }} end={{ x: 1, y: 0 }} />
  </MaskedView>
);
8. 版本兼容性

根据 RN 版本选择对应的库版本:

RN 版本 @react-native-ohos/masked-view
0.72 0.2.11
0.77 0.3.3

📊 对比:传统方案 vs MaskedView

特性 传统方案 MaskedView
文字渐变 ❌ 不支持 ✅ 支持
图标渐变 ❌ 不支持 ✅ 支持
形状裁剪 ⚠️ 限制较多 ✅ 灵活
性能 ⚠️ 一般 ✅ 优异
跨平台 ⚠️ 需要分别实现 ✅ 统一接口
开发效率 ⚠️ 需要编写原生代码 ✅ 开箱即用
API 简洁性 ❌ 复杂 ✅ 简洁
复杂效果 ❌ 难以实现 ✅ 易于实现
学习成本 ⚠️ 高 ✅ 低
鸿蒙支持 ❌ 不支持 ✅ 完整支持

📝 总结

通过集成 @react-native-masked-view/masked-view,我们为项目添加了强大的遮罩效果实现能力。这个库基于原生视图组件实现,提供了跨平台统一的遮罩效果 API,可以轻松实现文字渐变、图标渐变、形状裁剪等各种视觉效果,帮助开发者打造独特的产品体验。

关键要点回顾
  • 安装依赖: npm install @react-native-ohos/masked-view
  • 配置 overrides: 在 oh-package.json5 中添加 overrides 字段
  • 配置平台: 通过 har 包或直接链接源码,配置 CMakeLists.txt 和 PackageProvider.cpp
  • 集成代码: 使用 MaskedView 组件提供的各种 API
  • 支持功能: 文字遮罩、图标遮罩、渐变效果、嵌套遮罩等
  • 测试验证: 确保三端表现一致
  • 配合使用: 需要配合 LinearGradient 组件使用
常用 API 快速参考
import MaskedView from '@react-native-masked-view/masked-view';
import { LinearGradient } from 'react-native-linear-gradient';

// 基础用法
<MaskedView
  style={{ width: 200, height: 60 }}
  maskElement={
    <View style={{ backgroundColor: 'transparent', alignItems: 'center' }}>
      <Text style={{ fontSize: 48, fontWeight: 'bold' }}>Text</Text>
    </View>
  }
>
  <LinearGradient
    colors={['#FF6B6B', '#4ECDC4']}
    start={{ x: 0, y: 0 }}
    end={{ x: 1, y: 0 }}
    style={{ flex: 1 }}
  />
</MaskedView>

// 属性说明
- style: 遮罩视图的样式
- maskElement: 遮罩元素(通常是包含文字或图标的 View)
- androidRenderingMode: Android 渲染模式(可选)

// LinearGradient 属性
- colors: 渐变颜色数组
- start: 渐变起始点 { x, y }
- end: 渐变结束点 { x, y }
- locations: 颜色位置数组(可选)
Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐