图形学移动开发跨平台UI组件【免费下载链接】react-native-skiaHigh-performance React Native Graphics using Skia项目地址https://gitcode.com/gh_mirrors/re/react-native-skia点击查看免费下载本文围绕 react-native-skia 提供的Offset图像过滤器展开讲解如何沿 X/Y 轴平移被过滤的图像涵盖组件属性、声明式用法、与Skia.ImageFilter.MakeOffset底层 API 的对应关系以及如何将其与Blur等过滤器组合使用。读完本文你将掌握在 apps/docs/docs/image-filters/offset.md 场景下实现像素级平移、组合滤镜与 Web 端兼容性处理的具体方案。Offset 是什么Offset是 react-native-skia 提供的图像过滤器Image Filter组件。图像过滤器是一类作用于图像所有像素颜色位上的效果见 图像过滤器总览而Offset的作用非常直观将输入图像沿 X 轴与 Y 轴平移指定的像素距离其余像素保持原样。该过滤器与 SVG 的feOffset滤镜即 Web 标准中的feOffset元素行为一致因此熟悉 SVG 滤镜的开发者可以无缝迁移到 react-native-skia。组件属性Offset组件接受以下属性名称类型说明xnumber沿 X 轴的偏移量单位像素。ynumber沿 Y 轴的偏移量单位像素。children?ImageFilter可选的图像过滤器会先被应用再执行本偏移。从源码看Offset的组件实现位于 packages/skia/src/renderer/components/imageFilters/Offset.tsx其类型定义OffsetImageFilterProps位于 packages/skia/src/dom/types/ImageFilters.tsexport interface OffsetImageFilterProps extends ChildrenProps { x: number; y: number; }组件默认值为x 0、y 0即不传属性时过滤器不产生任何平移效果。x、y均可为负值向相反方向平移。基础示例平移一张图片下面是最简单的用法——在Canvas中绘制一张图片并应用Offset将其向右下角各平移 64 像素import { Canvas, Image, Offset, useImage, Fill } from shopify/react-native-skia; const Filter () { const image useImage(require(./assets/oslo.jpg)); if (!image) { return null; } return ( Canvas style{{ width: 256, height: 256 }} Fill colorlightblue / Image image{image} x{0} y{0} width{256} height{256} fitcover Offset x{64} y{64} / /Image /Canvas ); };要点说明useImage返回的图片加载完成前为null因此需要先做空值判断如上例中的if (!image)提前返回Offset作为Image的子组件children使用形成先渲染图片、再对结果施加偏移的滤镜管线背景先填充了lightblue这样偏移后露出的画布区域可见能直观看到平移产生的空边效果fitcover会让图片按覆盖方式填充到 256×256 的区域。运行效果如下图所示完整示例源自 offset.md 示例代码组合滤镜Offset 作为子过滤器管道的一环Offset的children属性允许传入另一个图像过滤器使其先于偏移执行。这在构建复合效果时非常实用例如先模糊、再平移import { Canvas, Image, Offset, Blur, useImage } from shopify/react-native-skia; const Composed () { const image useImage(require(./assets/oslo.jpg)); if (!image) { return null; } return ( Canvas style{{ width: 256, height: 256 }} Image image{image} x{0} y{0} width{256} height{256} fitcover Offset x{40} y{40} Blur blur{6} modeclamp / /Offset /Image /Canvas ); };这里Blur作为Offset的子节点先执行模糊模糊结果再被整体平移 40 像素。这种子过滤器先应用、父过滤器后应用的嵌套语义与 图像过滤器总览 中介绍的组合方式如ColorMatrix嵌套在Blur内一脉相承也呼应了 SVG 滤镜 DAG有向无环图中的输入-输出串联模型。底层实现从组件到 Skia.ImageFilter.MakeOffset声明式组件如何被翻译为底层 APIOffset组件本身是一个轻量封装Offset.tsx它把x、y转发给 DOM 节点skOffsetImageFilter。在渲染记录Recorder层declareOffsetImageFilter负责把属性翻译成 Skia 工厂调用packages/skia/src/sksg/Recorder/commands/ImageFilters.tsconst declareOffsetImageFilter ( ctx: DrawingContext, props: OffsetImageFilterProps ) { worklet; const { x, y } props; const imgf ctx.Skia.ImageFilter.MakeOffset(x, y, null); ctx.imageFilters.push(imgf); };注意这里传给MakeOffset的第三个参数是null表示使用动态源图像即当前正在绘制的输入内容作为过滤输入。这解释了声明式用法中为何Offset无需显式指定输入——它天然作用于其宿主元素如Image的渲染结果。命令式 APISkia.ImageFilter.MakeOffset如果你更偏好命令式写法可以直接使用Skia.ImageFilter.MakeOffset工厂方法类型签名见 packages/skia/src/skia/types/ImageFilter/ImageFilterFactory.tsMakeOffset( dx: number, dy: number, input?: SkImageFilter | null, // 为 null 时使用动态源图像 cropRect?: SkRect | null // 可选裁剪输入与输出 ): SkImageFilter;参数说明dx/dy沿 X / Y 轴的偏移量input输入过滤器为null时使用动态源图像例如保存的图层或当前绘制内容cropRect可选的裁剪矩形同时裁剪输入与输出。该命令式过滤器同样可以作为ImageFilter filter{...} /的filter属性传入声明式组件。仓库的 e2e 测试packages/skia/src/renderer/tests/e2e/ImageFilter.spec.tsx展示了这一用法const offsetFilter Skia.ImageFilter.MakeOffset(20, 20, null); const img await surface.draw( Group ImageFilter filter{offsetFilter} / Circle cx{50} cy{50} r{30} colorblue / /Group ); checkImage(img, docPath(image-filter/offset-filter.png));同一个测试文件还验证了偏移 模糊的复合过滤器写法Skia.ImageFilter.MakeOffset(10, 10, blurFilter)与声明式children嵌套在语义上完全等价。组合与合成顺序在渲染记录器中多个过滤器通过Skia.ImageFilter.MakeCompose(outer, inner)依次合成composeImageFilters后弹出的过滤器作为外层的outer先弹出的作为内层的inner。因此嵌套顺序决定了效果的执行顺序——越内层的子过滤器越先作用于源图像这一点在组合Blur与Offset时需特别留意。平台差异React Native Web 上的注意点react-native-skia 同时支持原生Android/iOS与 Web 平台。在 Web 端MakeOffset由 CanvasKit 实现packages/skia/src/skia/web/JsiSkImageFilterFactory.tsMakeOffset(dx, dy, input?, cropRect?) { const inputFilter input null || input undefined ? null : JsiSkImageFilter.fromValue(input); if (cropRect) { console.warn(cropRect is not supported on React Native Web for MakeOffset); } const filter this.CanvasKit.ImageFilter.MakeOffset(dx, dy, inputFilter); return new JsiSkImageFilter(this.CanvasKit, filter); }两点平台差异值得记住cropRect在 Web 端不被支持传入时会打印一条警告cropRect is not supported on React Native Web for MakeOffset并被忽略因此在跨平台项目中应避免依赖cropRect参数input为null或undefined时Web 端同样会回退为使用动态源图像行为与原生端一致。典型应用场景Offset虽然简单却是很多复杂效果的基础构件常见用途包括投影/描边效果DropShadow过滤器内部正是通过偏移 模糊 混合实现的。事实上MakeInnerShadow的源码ImageFilters.ts就调用了MakeOffset(dx, dy, f1)来定位阴影先生成轮廓再偏移出阴影位置最后模糊。像素级平移将贴图、文字或图形整体移动若干像素制造错位或重影效果复合滤镜的中间步骤作为过滤器 DAG 中的一环例如先偏移再混合MakeCompose/MakeBlend实现更精细的合成控制动画偏移由于Offset的属性可以被 react-native-skia 的动画系统驱动x、y支持传入动画值可以轻松实现图片缓慢滑动、视差滚动等动效。小结Offset是 react-native-skia 中最基础的图像过滤器之一等价于 SVG 的feOffset作用是把输入图像沿 X/Y 轴平移属性极简x、y两个必选数字children可嵌套其他过滤器实现先过滤、再偏移底层由Skia.ImageFilter.MakeOffset(dx, dy, input, cropRect)实现声明式组件与命令式 API 完全互通Web 端基于 CanvasKit 实现但cropRect不被支持跨平台开发时需规避。如需查看更多过滤器可继续阅读 图像过滤器总览、模糊滤镜 Blur、位移映射 DisplacementMap 与 阴影 Shadows。赞分享图形学移动开发跨平台UI组件【免费下载链接】react-native-skiaHigh-performance React Native Graphics using Skia项目地址https://gitcode.com/gh_mirrors/re/react-native-skia点击查看免费下载相关推荐React Native Skia Morphology 图像滤镜基于 Skia 的腐蚀erode与膨胀dilate实现指南React Native Skia Morphology 图像滤镜基于 Skia 的腐蚀erode与膨胀dilate实现指南 Morphology形图形学移动开发跨平台UI组件Rust 标准库指针偏移详解ptr::offset 的语义、安全契约与底层实现Rust 标准库指针偏移详解 ptr::offset 的语义、安全契约与底层实现 指针偏移pointer offset是 Rust 中所有内存遍历与数据结编程语言编译器语言运行时标准库告别直升机模式华硕笔记本风扇静音改造完全指南告别直升机模式华硕笔记本风扇静音改造完全指南 你是否曾在深夜工作时笔记本风扇突然起飞打断你的思绪或者在视频会议中风扇噪音让你不得不重复发言如果桌面应用系统编程上一篇SQLModel 删除数据教程用 session.delete() 与 commit 完成数据库 DELETE 操作下一篇HoppscotchAPI测试认证提升职业竞争力的途径创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
新春送福进一线:一场基层工会活动的策划与复盘 腊月下旬的北京,天亮得晚。活动室门口有人摸黑支桌子,红纸一卷一卷堆在墙角,砚台里的墨还没化开,凑近能闻到那股子墨香。常营地区总工会今年的"新春送福进一线"活动,就这么从一张桌子开始铺开了。说实话&… · 2026/9/25 3:05:43
easy-vibe 前端进阶教程:Figma 与 MasterGo 实战入门,从零创建网页原型 教程文档 【免费下载链接】easy-vibe 从 0 到 1 学会 vibe coding,项目制学习 项目地址: https://gitcode.com/datawhalechina/easy-vibe 点击查看 免费下载 本文基于 easy-vibe 教程 Stage 2(初级-中级开发)前端方向的《Figma 与… · 2026/9/25 3:05:37
F´ 中的规则与场景驱动测试:基于 STest 的组件单元测试框架详解 嵌入式系统编程 【免费下载链接】fprime F - A flight software and embedded systems framework 项目地址: https://gitcode.com/gh_mirrors/fpri/fprime 点击查看 免费下载 导读
STest 是 F(F Prime)飞行软件与嵌入式系统框架中内置的一个… · 2026/9/25 3:05:37
为什么地址是0x13?深入解析ps2-controller背后PS2手柄I2C通信原理 为什么地址是0x13?深入解析ps2-controller背后PS2手柄I2C通信原理 【免费下载链接】ps2-controller 源师兄扩展项目: PS2 | 由源师兄组织创建 项目地址: https://gitcode.com/yuanshixiong/ps2-controller
在 ps2-controller 这款源师兄出品的 PS2 手柄 I2C … · 2026/9/25 3:29:40
华为云与腾讯云怎么选?从云原生到信创的全场景决策指南 前阵子有个朋友找我做选型咨询,他们要做一个面向连锁餐饮企业的数据分析中台,既要卖软件又要做交付,甲方那边点名要“信创”。朋友打开两个网页问我:华为云和腾讯云到底差在哪?参数表我看得头晕,你直接告诉… · 2026/9/25 3:29:40
PCI简易通讯控制器黄标修复全指南 1. 黄色感叹号不是故障,而是Windows在向你发求救信号“PCI简易通讯控制器”这个名称听起来很陌生,但只要你打开设备管理器,展开“系统设备”或“其他设备”,大概率会看到它——一个带着黄色感叹号的灰色图标,名字里带着… · 2026/9/25 3:29:34
JobOps AI Provider配置终极对比:OpenAI、Claude还是Ollama本地部署免费方案 JobOps AI Provider配置终极对比:OpenAI、Claude还是Ollama本地部署免费方案 【免费下载链接】job-ops job-ops: DevOps principles applied to job hunting. A self-hosted pipeline to track, analyze, and assist your application process 项目地址: https://… · 2026/9/25 3:29:34
JVM执行引擎解析:解释器与JIT编译器优化实战 1. JVM执行引擎的双剑合璧:解释器与JIT编译器第一次接触Java时,我就被"一次编写,到处运行"的特性所吸引。直到深入JVM内部,才发现这个魔法背后是解释器与JIT编译器这对黄金搭档的完美配合。在实际工作中,我经… · 2026/9/25 3:29:28
OpenUsage如何把Token日志算成美元?模型定价引擎深度解析 OpenUsage如何把Token日志算成美元?模型定价引擎深度解析 【免费下载链接】openusage Burning through your subscriptions too fast? Paying for stuff you never use? Stop guessing. OpenUsage is free and open source. 项目地址: https://gitcode.com/gh_m… · 2026/9/25 3:29:28
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37