React Native Skia 阴影滤镜实战:用 Shadow 组件实现投影、内阴影与拟物化设计
图形学移动开发跨平台UI组件【免费下载链接】react-native-skiaHigh-performance React Native Graphics using Skia项目地址https://gitcode.com/gh_mirrors/re/react-native-skia点击查看免费下载ShadowDropShadow是 React Native Skia 提供的图像滤镜Image Filter组件用于在输入内容下方绘制投影Drop Shadow并可通过shadowOnly只渲染阴影、通过inner切换为内阴影Inner Shadow其效果与 CSS/SVG 的filter: drop-shadow()一一对应。读完本文你将掌握Shadow全部属性的语义与默认行为能独立实现投影组合、内阴影镂刻以及基于双阴影的 Neumorphism新拟态卡片效果并了解其底层在 SkiaMakeDropShadow系列工厂方法与滤镜 DAG 中的实现机制。一、Shadow 组件是什么在 React Native Skia 中Shadow是一个声明式的图像滤镜组件需要作为绘制节点如RoundedRect、Path、Image等的子节点使用而不是独立绘制的元素。它作用于“输入内容”——即它所挂载的父节点所绘制的内容在其下方生成一个有偏移、有高斯模糊、可指定颜色的阴影。从源码结构看Shadow组件本身只是一个极薄的声明式包装// packages/skia/src/renderer/components/imageFilters/Shadow.tsx import type { DropShadowImageFilterProps } from ../../../dom/types; export const Shadow (props: SkiaPropsDropShadowImageFilterProps) { return skDropShadowImageFilter {...props} /; };它最终对应 DOM 节点类型NodeType.DropShadowImageFilter见 NodeType.ts在渲染时被推入绘制上下文中的 image filter 栈由declareDropShadowImageFilter处理见 ImageFilters.ts。提示DropShadow滤镜等价于其 SVG/CSS 对应物因为 Box 阴影方案要快得多详见第四节。二、属性一览Shadow的属性定义在 ImageFilters.tsexport interface DropShadowImageFilterProps extends ChildrenProps { dx: number; dy: number; blur: number; color: Color; inner?: boolean; shadowOnly?: boolean; }NameType说明dxnumber阴影沿 X 轴的偏移量dynumber阴影沿 Y 轴的偏移量blurnumber阴影的模糊半径高斯模糊 sigmacolorColor投影颜色支持十六进制字符串、命名色等 Color 类型值inner?boolean为true时阴影绘制在输入内容内部内阴影shadowOnly?boolean为true时结果只包含阴影不包含输入内容本身children?ImageFilter可选的子图像滤镜先应用于输入内容再叠加本阴影其中color会被processColor统一转换为 Skia 的SkColordx、dy、blur直接透传给底层工厂方法。结合实现代码ImageFilters.ts可以看到三个可选标志的完整组合逻辑inner为false且shadowOnly为false调用ImageFilter.MakeDropShadow(dx, dy, blur, blur, color, null)——标准投影结果包含输入内容shadowOnly为true调用MakeDropShadowOnly(...)——只输出阴影输入内容被剔除便于在滤镜 DAG 中灵活组合inner为true走自定义的MakeInnerShadow(...)实现shadowOnly决定内阴影阶段是否包含原始内容。在底层工厂方法签名中见 ImageFilterFactory.tsblur实际上会被同时作为 X/Y 两个方向的 sigma即sigmaX sigmaY blur传给MakeDropShadow/MakeDropShadowOnly此外这两个工厂方法还接受可选的input与cropRect参数分别用于指定输入滤镜与裁剪区域JS 侧声明式用法下默认使用动态源图像。三、Drop Shadow投影实战Neumorphism下面的示例在同一个圆角矩形上叠加了两层方向相反的投影——右上偏冷色、左下偏暖色这正是 Neumorphism新拟态卡片最常见的双阴影配方。它等价于以下 CSS 写法.paint { filter: drop-shadow(12px 12px 25px #93b8c4) drop-shadow(-12px -12px 25px #c7f8ff); }对应的 React Native Skia 代码import { Shadow, Fill, RoundedRect, Canvas } from shopify/react-native-skia; const Neumorphism () { return ( Canvas style{{ width: 256, height: 256 }} Fill colorlightblue / RoundedRect x{32} y{32} width{192} height{192} r{32} colorlightblue Shadow dx{12} dy{12} blur{25} color#93b8c4 / Shadow dx{-12} dy{-12} blur{25} color#c7f8ff / /RoundedRect /Canvas ); };要点拆解多个Shadow依次叠加两个滤镜按声明顺序先后作用于同一输入内容最终通过MakeCompose(outer, inner)组合成一条滤镜链见 ImageFilters.ts 的composeImageFilters偏移方向决定立体感dx/dy同时取正值表示阴影向右下延伸光源在左上同时取负值则向左上延伸光源在右下一正一负组合即可模拟环境光与点光源的双重照明blur即模糊半径数值越大阴影边缘越柔和、越“弥散”25 是文档示例中较为温和的中等值color使用十六进制色值也支持lightblue这类命名色与Skia.Color()返回的SkColor值。效果该用例与仓库中的端到端测试一一对应在 ImageFilters.spec.tsx 中测试用surface.draw渲染相同结构Fill lightblue 圆角矩形 两个Shadow并与docPath(image-filters/dropshadow.png)基准图对比阈值 0.05验证渲染结果与文档示例一致。四、Inner Shadow内阴影实战给Shadow加上inner属性阴影就会被裁剪进输入内容的内部呈现出“内容向内凹陷”的效果——适合镂空按钮、凹槽输入框、内嵌面板等场景。将上例的两个投影改为内阴影import { Shadow, Fill, RoundedRect, Canvas } from shopify/react-native-skia; const Neumorphism () { return ( Canvas style{{ width: 256, height: 256 }} Fill colorlightblue / RoundedRect x{32} y{32} width{192} height{192} r{32} colorlightblue Shadow dx{12} dy{12} blur{25} color#93b8c4 inner / Shadow dx{-12} dy{-12} blur{25} color#c7f8ff inner / /RoundedRect /Canvas ); };与投影版唯一的区别就是每个Shadow都多了inner标志。效果内阴影的底层原理源码级在 ImageFilters.ts 的MakeInnerShadow实现中Skia 会构建一条滤镜 DAG用MakeColorFilter(MakeBlend(Black, Dst))提取原始图形的“源图”source graphic用MakeColorFilter(MakeBlend(Black, SrcIn))提取原始图形的 alpha 通道作为sourceAlpha通过MakeColorFilter(MakeMatrix(AlphaSaturate))先把 alpha 饱和成硬轮廓解决半透明图形内阴影失真问题对应 issue #2990依次叠加SrcOut颜色混合、MakeOffset(dx, dy)偏移、MakeBlur模糊生成“形状外部的阴影”用MakeBlend(SrcIn, sourceAlpha, ...)把阴影裁剪回形状内部即得到内阴影若shadowOnly为假再通过MakeCompose把sourceGraphic与内阴影以SrcOver混合恢复内容本体。该实现同样在测试用例中有验证见 ImageFilters.spec.tsxinner双阴影渲染对比innershadow.png以及 [L246-L296]对文字路径Path同时叠加绿色内阴影与蓝色外阴影并与快照snapshots/image-filter/test-shadow.png对比。什么时候别用 Shadow 做内阴影文档明确提醒如果只是想给圆角矩形渲染内阴影BoxBoxShadow方案要快得多见 Box 文档。BoxShadow额外提供spread属性阴影扩散范围并且是专门为矩形/圆角矩形优化的内阴影原语而Shadow是通用图像滤镜需经过上述多级滤镜 DAG适合任意形状路径、文字、位图等。原则规则几何体优先用 Box任意形状再用 Shadow。五、进阶组合shadowOnly、children 与阴影复用5.1 shadowOnly只画阴影不画内容shadowOnly为true时结果只保留阴影本身输入内容被剔除。典型用途把阴影从内容中解耦配合位移/缩放单独摆放在滤镜 DAG 中把“阴影层”当作中间产物继续叠加其他滤镜与Blend、Merge等滤镜组合实现多图层合成。它映射到底层MakeDropShadowOnly工厂方法——该方法与MakeDropShadow的算法完全一致唯一区别是结果图像不包含输入内容见 ImageFilterFactory.ts 的注释说明。测试用例 ImageFilters.spec.tsx 展示了shadowOnly的用法黄色圆角矩形 dx-12 dy-12 blur25 colormagenta shadowOnly渲染结果对比基准图dropshadow-only.png可直观看到只有品红色阴影、没有黄色内容。5.2 children先应用子滤镜children属性接受另一个ImageFilter如Blur、ColorMatrix、Offset等它会先作用于输入内容再生成阴影。这使Shadow可以参与滤镜组合链例如先对内容做模糊/调色再基于处理后的结果投射阴影。关于图像滤镜的一般组合方式可参考 Image Filters 总览 中的嵌套示例Blur内嵌ColorMatrix。5.3 组合范例内阴影 外投影同屏inner与shadowOnly可以同时使用内阴影 只画阴影两个Shadow也可以分别设置不同标志混排——例如对一个Path文字同时加外投影与内阴影见测试 ImageFilters.spec.tsxPath path{path} colorred Shadow dx{0} dy{4} blur{1} color#00FF00 inner / Shadow dx{0} dy{4} blur{0} color#0000ff / /Path注意这里第二个Shadow的blur{0}模糊半径可以为 0此时阴影退化为纯偏移的硬阴影等价于直接使用Offset滤镜见 offset.md常用于制造锐利的描边式投影。六、小结与速查Shadow是声明式图像滤镜挂在绘制节点内部使用等价于 CSSdrop-shadow()核心参数dx/dy偏移、blur模糊半径同时作为 X/Y 两个方向的 sigma、color阴影颜色inner决定内阴影shadowOnly决定是否剔除输入内容两者可组合多阴影按声明顺序叠加组合最终以MakeCompose组成滤镜链底层映射非内阴影走MakeDropShadow/MakeDropShadowOnly内阴影走自定义MakeInnerShadow滤镜 DAGalpha 饱和 偏移 模糊 SrcIn 裁剪圆角矩形的内阴影优先使用BoxBoxShadow更快且支持spread全部属性、类型与渲染逻辑均可在仓库中溯源Shadow 组件、属性类型、声明式实现、底层工厂 API、端到端测试。赞分享图形学移动开发跨平台UI组件【免费下载链接】react-native-skiaHigh-performance React Native Graphics using Skia项目地址https://gitcode.com/gh_mirrors/re/react-native-skia点击查看免费下载相关推荐探索React Native的阴影魔法react-native-shadow-2探索React Native的阴影魔法react native shadow 2 在移动应用开发的世界中细节往往决定成败。阴影效果作为提升UI质感的关键元素上一篇QuickRecorder免费轻量 macOS 录屏工具7 种录制模式一次讲清下一篇OpCore-Simplify 实战教程四个阶段自动生成一份可引导的 OpenCore EFI创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

OS第二章随手记(2.1)

OS第二章随手记(2.1)

目录 一、进程阻塞的过程 二、阻塞队列 三、对时钟中断与中断的思考🤔 四、虚拟地址的思考 五、保存程序状态 六、int 0x80 的思考 七、中断源 八、陷入机制 九、MMU的简略描述 十、王道题目知识点总结 一、进程阻塞的过程 进程调用了一个系统调用函数去访…

2026/9/25 16:54:19 阅读更多 →
写屏障机制原理

写屏障机制原理

写屏障机制原理 1. 核心概念与工作原理 并发 GC 最大的难题不是"如何快",而是"如何对"。当 GC 扫描与用户 goroutine 同时运行时,用户 goroutine 改写指针的瞬间可能让 GC 漏标存活对象。这就需要一种机制——每当用户程序执行指针赋…

2026/9/25 16:54:19 阅读更多 →
KytyPS5跨平台实战指南:Windows、Linux与macOS上运行PS5模拟器的终极配置清单

KytyPS5跨平台实战指南:Windows、Linux与macOS上运行PS5模拟器的终极配置清单

KytyPS5跨平台实战指南:Windows、Linux与macOS上运行PS5模拟器的终极配置清单 【免费下载链接】KytyPS5 PlayStation 5 emulator for Windows, Linux and MacOS 项目地址: https://gitcode.com/gh_mirrors/ky/KytyPS5 KytyPS5 是一款免费开源的 PS5 模拟器&a…

2026/9/25 16:54:19 阅读更多 →

最新新闻

PromptX Runtime架构剖析:Docker式Agent生命周期与事件驱动SystemBus设计

PromptX Runtime架构剖析:Docker式Agent生命周期与事件驱动SystemBus设计

PromptX Runtime架构剖析:Docker式Agent生命周期与事件驱动SystemBus设计 【免费下载链接】PromptX PromptX 领先的AI 智能体上下文平台 | PromptX Leading AI Agent Context Platform 项目地址: https://gitcode.com/Deepractice/PromptX Prom…

2026/9/25 17:39:49 阅读更多 →
Ubuntu 22.04 LTS开发环境实战配置指南

Ubuntu 22.04 LTS开发环境实战配置指南

1. 这不是“又一篇Ubuntu安装教程”,而是一份我亲手踩过27次坑、重装过14台机器后整理的22.04 LTS实战手册你搜“Ubuntu 22.04 LTS安装配置”时,看到的大多是截图堆砌、命令复制粘贴、步骤编号到5就戛然而止的“半成品”。有人装完连中文输入法都打不出字…

2026/9/25 17:39:49 阅读更多 →
Lottery 抽奖系统部署实战:Docker 安装 Nacos 注册中心并接入 Dubbo 服务注册

Lottery 抽奖系统部署实战:Docker 安装 Nacos 注册中心并接入 Dubbo 服务注册

文档教程后端 【免费下载链接】CodeGuide :books: 本代码库是作者小傅哥多年从事一线互联网 Java 开发的学习历程技术汇总,旨在为大家提供一个清晰详细的学习教程,侧重点更倾向编写Java核心内容。如果本仓库能为您提供帮助,请给予支持(关注、…

2026/9/25 17:39:49 阅读更多 →
使用 GDB 与 SWD 调试探针对 PX4 固件进行交互式调试:从连接到实战

使用 GDB 与 SWD 调试探针对 PX4 固件进行交互式调试:从连接到实战

嵌入式物联网机器人自动驾驶智能硬件 【免费下载链接】PX4-Autopilot PX4 Autopilot Software 项目地址: https://gitcode.com/gh_mirrors/px/PX4-Autopilot 点击查看 免费下载 本指南以 PX4-Autopilot 官方调试文档(gdb_debugging.md)为核心…

2026/9/25 17:39:49 阅读更多 →
RisingWave 自定义 Lint 体系实战:基于 cargo dylint 的 Rust 代码规范与 Clippy 扩展

RisingWave 自定义 Lint 体系实战:基于 cargo dylint 的 Rust 代码规范与 Clippy 扩展

数据库流处理后端数据工程 【免费下载链接】risingwave Event streaming platform for agentic AI. Continuously ingest, transform, and serve event streams in real time, at scale. 项目地址: https://gitcode.com/gh_mirrors/ri/risingwave 点击查看 免费下载…

2026/9/25 17:39:48 阅读更多 →
AI提示词帮你搞定任务优先级排序,告别决策瘫痪

AI提示词帮你搞定任务优先级排序,告别决策瘫痪

1. 为什么“事情太多先做什么”是个真问题你有没有过这种早晨:闹钟响了第三遍才爬起来,手机一解锁,微信未读99,邮箱里躺着三封标红的“紧急”,待办清单上密密麻麻列了二十多条,脑子里同时转着“下午要交周报…

2026/9/25 17:38:48 阅读更多 →

日新闻

AI元人文:从工具使用到思维重构的深度探索

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:00:41 阅读更多 →
Python+CNN车牌识别实战:从数据预处理到模型训练与部署

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:00:41 阅读更多 →
Vim基础操作全攻略:保存退出、模式切换与高频命令实战

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/25 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/25 11:15:26 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →