You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用react-native-svg实现带模糊效果的空心圆形图片遮罩?

问题:React Native 实现带模糊镂空的空心圆形遮罩效果

我尝试用react-native-svg实现如下效果:背景是动态图,添加空心圆形遮罩,且遮罩区域外的背景图要做模糊处理。目前只能实现普通的模糊镂空,做不出目标的空心圆形样式,求技术建议。

当前代码示例:

<ImageBackground
  resizeMode="cover"
  source={{ uri: route.params?.image }}
  style={{ flex: 1}}
  blurRadius={0}
>
  <View
    style={{
      flex: 1,
      justifyContent: "center",
      alignItems: "center",
    }}
  >
    <Svg width={300} height={300}>
      <Circle cx={150} cy={150} r={120} fill="transparent" />
      <Circle
        cx={150}
        cy={150}
        r={120}
        strokeWidth={60}
        stroke={hexToRgba("#000", "0.4")}
        fill="transparent"
      />
    </Svg>
  </View>
</ImageBackground>

当前效果:
当前效果

预期效果:
预期效果


解决方案

核心思路是通过SVG的<Mask>遮罩结合双层背景图实现:底层放模糊后的背景,上层放清晰背景并通过遮罩控制显示区域,同时叠加半透明遮罩层。以下是完整实现代码:

import React from 'react';
import { ImageBackground, View } from 'react-native';
import Svg, { Circle, Defs, Mask, Rect } from 'react-native-svg';

// 颜色转换函数(如果已有可直接复用)
const hexToRgba = (hex, alpha) => {
  const r = parseInt(hex.slice(1, 3), 16);
  const g = parseInt(hex.slice(3, 5), 16);
  const b = parseInt(hex.slice(5, 7), 16);
  return `rgba(${r}, ${g}, ${b}, ${alpha})`;
};

const HollowBlurMask = ({ route }) => {
  return (
    <View style={{ flex: 1 }}>
      {/* 1. 底层:模糊后的背景图,占满整个屏幕 */}
      <ImageBackground
        resizeMode="cover"
        source={{ uri: route.params?.image }}
        style={{ 
          flex: 1, 
          position: 'absolute', 
          width: '100%', 
          height: '100%' 
        }}
        blurRadius={10} // 可根据需求调整模糊程度
      />

      {/* 2. 上层:清晰背景 + SVG遮罩 */}
      <ImageBackground
        resizeMode="cover"
        source={{ uri: route.params?.image }}
        style={{ flex: 1 }}
      >
        <Svg style={{ position: 'absolute', width: '100%', height: '100%' }}>
          <Defs>
            {/* 定义空心圆形遮罩:白色区域显示上层内容,黑色区域透出底层模糊背景 */}
            <Mask id="hollowCircle">
              {/* 填充整个画布为白色,作为遮罩基础 */}
              <Rect x="0" y="0" width="100%" height="100%" fill="white" />
              {/* 中间圆形设为黑色,实现镂空效果 */}
              <Circle cx="50%" cy="50%" r="120" fill="black" />
            </Mask>
          </Defs>

          {/* 半透明遮罩层:应用遮罩后,仅外部区域显示半透明黑色 */}
          <Rect
            x="0"
            y="0"
            width="100%"
            height="100%"
            fill={hexToRgba("#000", "0.6")}
            mask="url(#hollowCircle)"
          />
        </Svg>
      </ImageBackground>
    </View>
  );
};

export default HollowBlurMask;

关键逻辑说明:

  • 双层背景图:底层背景添加blurRadius实现模糊,上层保持清晰,通过遮罩让中间区域显示清晰背景,外部透出底层模糊效果
  • SVG遮罩原理:<Mask>中白色区域会保留上层内容,黑色区域会隐藏上层内容(透出下层),因此先填充全屏白色,再画黑色圆形,刚好实现中间镂空的效果
  • 半透明遮罩层:叠加在清晰背景上,应用遮罩后只有外部区域显示半透明黑色,强化空心圆形的视觉边界

如果是动态图(比如GIF或视频帧),只要source的uri指向正确的动态资源即可,ImageBackground会自动处理动态内容的渲染。

内容的提问来源于stack exchange,提问作者wbdlc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 20:34:57