十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

uni-app 微信小程序 snapshot 组件指南:Skyline 渲染下子节点截图(mode 模式与 takeSnapshot 实践)

uni-app 微信小程序 snapshot 组件指南:Skyline 渲染下子节点截图(mode 模式与 takeSnapshot 实践) uni-app 微信小程序 snapshot 组件指南Skyline 渲染下子节点截图mode 模式与 takeSnapshot 实践【免费下载链接】uni-appA cross-platform framework using Vue.js项目地址: https://gitcode.com/gh_mirrors/un/uni-app导读snapshot 是 uni-app 面向微信小程序 Skyline 渲染引擎提供的专用组件用于把组件内部子节点渲染成截图实现“所见即所得”的节点图片化能力。本文将围绕该组件的兼容性边界、mode属性的两种渲染模式view/picture展开讲解并结合仓库内takeSnapshot元素截图示例与自动化测试用例给出从组件声明到截图结果落地的完整实战方案。组件定位微信小程序 Skyline 场景下的截图组件snapshot 组件的核心价值是把一段真实渲染的 UIview、text、image、scroll-view 乃至自定义组件通过截图的方式固化为图片从而支持保存到相册、分享海报、生成预览图等业务场景。与调用全局截图 API 相比snapshot 组件以声明式方式圈定“要截取哪一块区域”逻辑更内聚、边界更清晰。需要特别注意的是其平台边界。根据 docs/component/snapshot.md 中的兼容性声明| Web | 微信小程序 | Android | iOS | HarmonyOS | | :- | :- | :- | :- | :- | | x | 4.41 | x | x | x |该组件仅微信小程序端可用且要求基础库/版本不低于4.41Web、Android、iOS、HarmonyOS即 uni-app x 的 App 端与鸿蒙端均标记为x不支持从“参见”中的相关 Bug条目component.wx.skyline.snapshot可以推断该组件属于微信小程序 Skyline 渲染引擎的能力集合与同目录下的 grid-builder、list-builder、tap-gesture-handler 等文档见 docs/component/_sidebar.md同属一套 Skyline 组件体系使用前提是页面已切换到 Skyline 渲染引擎。因此本文所有用法说明均以“微信小程序 Skyline 基础库 4.41”为适用前提。mode 属性两种渲染模式对比snapshot 组件只有一个核心属性mode类型为string用于声明组件采用何种方式产出截图。原文档给出的属性定义如下| 名称 | 类型 | 兼容性 | 描述 | | :- | :- | :-: | :- | | mode | string | Web: x; 微信小程序: 4.41; Android: x; iOS: x; HarmonyOS: x | 渲染模式 |mode的合法值及其语义| 合法值 | 兼容性 | 描述 | | :- | :-: | :- | | view | Web: x; 微信小程序: 4.41; Android: x; iOS: x; HarmonyOS: x | 以真实节点渲染。 | | picture | Web: x; 微信小程序: 4.41; Android: x; iOS: x; HarmonyOS: x | 对子节点生成的内容截图渲染。 |两种模式在渲染机制上的差异决定了它们的适用取舍modeview真实节点渲染组件内部子节点以真实节点方式存在页面上的 UI 即为最终显示效果适合“界面本身就是要展示的内容”的场景例如把一段常驻展示的卡片区域原样呈现交互与布局表现稳定、直观。modepicture截图渲染组件先把子节点内容截图再以图片形式渲染适合“节点只作为截图素材、最终以图片形态对外使用”的场景例如海报生成、分享图预览等——业务侧拿到截图文件后即可脱离原节点独立使用。实际选型时可按“最终呈现形态”判断如果页面里需要同时保留可交互的原始 UI倾向view如果目标是把该区域固化成图片保存、分享、上传倾向picture。基础用法示例在微信小程序 Skyline 页面中通过pages.json将页面renderer声明为skylineuni-app 中对应的配置方式见 docs/api/app-route.md 对renderer取值webview/skyline/xr-frame的说明然后在模板中使用 snapshot 组件包裹待截图内容template view classpage !-- picture 模式子节点内容被截图渲染 -- snapshot modepicture classsnapshot-box view classcard text classtitle分享海报标题/text text classdesc这里是需要固化为图片的内容/text /view /snapshot /view /template.snapshot-box { width: 600rpx; height: 400rpx; } .card { padding: 30rpx; background-color: #ffffff; }要点待截图内容必须放在 snapshot 组件内部组件圈定的范围即截图范围建议为 snapshot 组件显式设置宽高保证截图区域尺寸可控截图的最终落地保存相册、生成临时文件需要配合微信小程序的节点截图/图片保存能力完成snapshot 组件负责“区域内节点 → 图片化”这一环。仓库实践takeSnapshot 元素截图完整示例虽然 snapshot 组件仅限微信小程序 Skyline 使用但“对指定 UI 区域截图”这一需求在 uni-app x 的 App 端也有对应实现——即通过uni.getElementById获取节点后调用takeSnapshot方法。仓库中提供了完整的示例页面与自动化测试可作为理解 snapshot 组件设计意图节点 → 截图的最佳对照素材。示例页面element-takesnapshotsrc/pages/API/element-takesnapshot/element-takesnapshot.uvue 演示了如何对一个页面根 view、以及 view / text / image / scroll-view / 自定义组件分别截图function takeSnapshotClick() { const view uni.getElementById(snapshot-content)! view.takeSnapshot({ success: (res) { console.log(takeSnapshot success, res.tempFilePath) data.snapImage res.tempFilePath mode.value widthFix uni.showToast({ title: 截图成功路径 res.tempFilePath, icon: none }) }, fail: (res) { console.log(takeSnapshot fail, res) uni.showToast({ icon: error, title: 截图失败 }) }, complete: (res) { data.completeTriggered true console.log(takeSnapshot complete, res) } }) }该页面在 src/pages.json 中注册pages/API/element-takesnapshot/element-takesnapshot。从中可以沉淀出一套可复用的元素截图模板给待截图节点设置id如idsnapshot-content通过uni.getElementById(id)获取节点调用node.takeSnapshot({ success, fail, complete })在success回调中通过res.tempFilePath拿到截图临时文件路径用image :srctempFilePath展示截图结果或继续调用uni.saveImageToPhotosAlbum保存到相册。示例页还演示了对多种节点类型view、text、image、scroll-view、自定义组件的统一截图封装function takeSnapshotForElement(elementId: string, dataKey: keyof SnapshotDataType) { const element uni.getElementById(elementId)! element.takeSnapshot({ success: (res) { snapshotData[dataKey] res.tempFilePath uni.showToast({ title: 截图成功, icon: success }) }, fail: () { uni.showToast({ icon: error, title: 截图失败 }) } }) }自动化测试验证截图链路src/pages/API/element-takesnapshot/element-takesnapshot.test.js 提供了对该截图的自动化验证可佐证截图链路的可靠性测试区分平台Web / App-webview / 小程序mp平台直接跳过截图断言not support即该能力默认在原生 App 端验证用例先reLaunch到示例页并等待渲染完成再点击.btn-TakeSnapshot触发截图断言data.snapImage即res.tempFilePath长度大于 20说明成功返回了有效的临时文件路径另一用例断言complete回调一定被触发验证回调时序完整性。测试注释中给出了一次真实运行时的截图产物示例路径/storage/emulated/0/Android/data/io.dcloud.uniappx/apps/__UNI__3584C99/cache/temp/screenshot/1697513148915.png可见截图以时间戳命名的 png 文件落在应用缓存目录之后即可用于展示或保存。微信小程序侧的保存落地建议结合示例页的saveToAlbum逻辑见 element-takesnapshot.uvue微信小程序侧拿到 snapshot 组件截图结果后可参照同一模式完成落地从截图结果中取得本地文件路径调用uni.showActionSheet提供“保存”操作用户确认后调用uni.saveImageToPhotosAlbum({ filePath })保存到相册失败时通过uni.showModal展示errCode/errMsg便于用户授权或重试。注意事项与排障入口版本门槛仅微信小程序且基础库4.41可用低版本或非 Skyline 渲染下组件不会生效编译期可配合renderer: skyline的页面配置使用平台隔离uni-app 中可在模板上使用条件编译!-- #ifdef MP-WEIXIN --将 snapshot 组件限制在微信小程序端避免其他端报未知组件错误区域边界截图范围以 snapshot 组件自身尺寸为准需显式控制组件的宽高问题追踪仓库文档的“参见”一节提供了相关 Bug 入口component.wx.skyline.snapshot并列出微信小程序、支付宝、百度、抖音、飞书、钉钉、QQ、快手、京东、华为快应用、360 小程序等各平台对 snapshot 能力的文档入口便于对照各端支持情况如遇官方文档与 uni-app 表现不一致应以 uni-app 编译产物在目标平台上的实际行为为准。小结snapshot 组件是 uni-app 在微信小程序 Skyline 渲染引擎下“按区域截图”的官方组件方案通过mode的view/picture两种模式分别满足“真实节点渲染”与“截图渲染”两类诉求兼容性上严格限定在微信小程序 4.41。若你在 uni-app x 的 App 端也需要类似能力则可直接参考仓库的 element-takesnapshot 示例页 与 对应测试通过uni.getElementByIdtakeSnapshot以 API 方式实现同等效果。两条路径共同构成了 uni-app 体系内“UI → 图片”的完整能力拼图。【免费下载链接】uni-appA cross-platform framework using Vue.js项目地址: https://gitcode.com/gh_mirrors/un/uni-app创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表