React Native 鸿蒙跨平台开发:@react-native-masked-view-masked-view 遮罩视图代码指南

欢迎加入开源鸿蒙跨平台社区: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 安装
bash 复制代码
npm install @react-native-ohos/masked-view@0.2.11-rc.1
2. 验证安装

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

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,添加:

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

目前有两种方法:

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

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

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

json 复制代码
"dependencies": {
    "@react-native-ohos/masked-view": "file:../../node_modules/@react-native-ohos/masked-view/harmony/masked_view.har"
}

点击右上角的 sync 按钮

或者在终端执行:

bash 复制代码
cd harmony/entry
ohpm install
方法二:直接链接源码

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

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

json 复制代码
modules: [
  ...
  {
    name: 'masked_view',
    srcPath: './masked_view',
  }
]

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

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

json 复制代码
"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,添加:

diff 复制代码
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,添加:

diff 复制代码
#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 按钮

或者在终端执行:

bash 复制代码
cd harmony/entry
ohpm install

然后编译、运行即可。

💻 完整代码示例

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

javascript 复制代码
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. 基础使用(文字渐变)

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

javascript 复制代码
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)的透明区域决定可见区域:

javascript 复制代码
// 正确:使用透明背景
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. 渐变方向配置

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

javascript 复制代码
// 水平渐变(从左到右)
<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. 多色渐变配置

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

javascript 复制代码
// 多色渐变
<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. 图标遮罩使用

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

javascript 复制代码
<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,实现更复杂的效果:

javascript 复制代码
<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 性能优异,但仍需注意以下优化点:

javascript 复制代码
// ✅ 正确:避免在列表中频繁创建新的 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 快速参考
javascript 复制代码
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: 颜色位置数组(可选)
相关推荐
若兰幽竹1 小时前
【HarmonyOS 6.1 全场景实战】《灵犀厨房》实战(三):ArkTS 高效开发:TypeScript 核心与 API 23 新规
harmonyos·鸿蒙系统·harmonyos6.1.0
Swift社区1 小时前
鸿蒙 PC 为什么更像“系统”,而不是“应用平台”?
华为·harmonyos
wordbaby1 小时前
如何封装一个生产级的 React Native 分页列表 Hook
前端·react native·react.js
aqi003 小时前
一文速览 HarmonyOS 6.0.1 引入的十个新特性
android·华为·harmonyos·鸿蒙·harmony
麟听科技3 小时前
HarmonyOS 6.0+ 跨端智能写作助手开发实战:多设备接续编辑与AI辅助创作落地
人工智能·分布式·华为·harmonyos·ai写作
求学中--3 小时前
ArkUI电商首页完整实战
华为·typescript·harmonyos
xmdy58663 小时前
Flutter+开源鸿蒙实战|城市共享驿站智能存取系统 Day1 项目初始化+架构分层+多端适配+全局状态基座
flutter·开源·harmonyos
前端不太难3 小时前
AI 能力如何变成鸿蒙 App 的基础设施
人工智能·状态模式·harmonyos
M ? A4 小时前
Vue 转 React | VuReact 实时监听开发指南
前端·vue.js·后端·react.js·面试·开源·vureact
空中海4 小时前
01 鸿蒙知识体系图与环境基础
华为·harmonyos