当前位置: 首页 > news >正文

一张图搞懂 HarmonyOS SnapshotUtil:什么场景用哪个截图方法?

文章目录

    • 背景
      • 方法总览
      • 四种截图方式一览
      • 场景一:截取页面上某个区域
      • 场景二:生成分享卡片(不需要显示在屏幕上)
      • 场景三:截取整个应用窗口
      • 场景四:截屏行为监听
      • 选型决策树
      • PixelMap 得到后能做什么?
      • 写在最后

背景

近期发现一款很有意思的HarmonyOS 三方库, 地址 @pura/harmony-utils(V1.4.0) , 作者是"桃花镇童长老", 我这里也是直接通过该作者公布的源码进行案例编写进行,写了到目前写了一部分demo ,感觉确实很有帮助,这里呢也是开始写一个系列的演示demo 供大家参考。如有帮助可以在OpenHarmony中进行下载安装进行使用哦

案例demo导航展示

↓↓↓↓↓↓接下来言归正传 ↓↓↓↓

截图功能在移动应用里非常普遍:分享内容、生成海报、截屏检测……前面分三篇分别讲了SnapshotUtil的各个方法。这篇做个总结,把四种截图方式放在一起,告诉你什么场景用哪个。

方法总览

四种截图方式一览

方法截图对象是否需要组件 ID同/异步
get(id)屏幕上已渲染的指定组件需要异步
getSync(id)屏幕上已渲染的指定组件需要同步
createFromBuilder(fn)离屏渲染的 Builder 内容不需要异步
snapshot()整个应用窗口不需要异步

场景一:截取页面上某个区域

比如截取商品卡片、文章预览、用户信息卡:

给目标组件设置 id

Column({space:8}){Text('这是一个演示组件').fontSize(16).fontColor('#333').fontWeight(FontWeight.Bold)Text('可对该区域进行组件截图').fontSize(13).fontColor('#666')Row({space:8}){ForEach(['红','绿','蓝'],(label:string,idx:number)=>{Column(){Circle({width:40,height:40}).fill(idx===0?'#FF6B6B':idx===1?'#4ECDC4':'#45B7D1')Text(label).fontSize(12).fontColor('#666')}},(label:string)=>label)}}.id('snapshot_target')// 必须设置 id.width('100%').padding(16).backgroundColor('#FFFFFF').borderRadius(10).border({width:2,color:'#4A90E2',style:BorderStyle.Dashed})

调用截图

// 基础截图SnapshotUtil.get('snapshot_target').then(pm=>{this.snapshotPixelMap=pm;this.addLog(`get("snapshot_target") → PixelMap${pm.getPixelBytesNumber()}bytes`);}).catch((e:Error)=>{this.addLog(`get() Error:${e.message}`);});// 缩放截图(减少文件大小)SnapshotUtil.get('snapshot_target',{scale:0.5}).then(pm=>{this.snapshotPixelMap=pm;this.addLog(`get("snapshot_target", {scale:0.5}) →${pm.getPixelBytesNumber()}bytes`);}).catch((e:Error)=>{this.addLog(`get() Error:${e.message}`);});

场景二:生成分享卡片(不需要显示在屏幕上)

生成海报、分享图,内容不需要让用户看到:

定义离屏 Builder(必须在 struct 外部)

@BuilderfunctionbuilderParam(){Column({space:6}){Text('SnapshotUtil 离屏渲染示例').fontSize(16).fontColor('#FFFFFF').fontWeight(FontWeight.Bold)Text('createFromBuilder 截图内容').fontSize(12).fontColor('#CCFFCC')Row({space:6}){Circle({width:20,height:20}).fill('#FF6B6B')Circle({width:20,height:20}).fill('#4ECDC4')Circle({width:20,height:20}).fill('#FFE66D')}}.width(260).height(100).backgroundColor('#2C3E50').borderRadius(12).justifyContent(FlexAlign.Center).alignItems(HorizontalAlign.Center)}

生成截图

// 基础版(delay 300ms,不检查图片状态)SnapshotUtil.createFromBuilder(builderParam,300,false).then(pm=>{this.builderPixelMap=pm;this.addLog(`createFromBuilder() → PixelMap${pm.getPixelBytesNumber()}bytes`);}).catch((e:Error)=>{this.addLog(`createFromBuilder() Error:${e.message}`);});// 有网络图片时,delay 长一点并检查图片状态SnapshotUtil.createFromBuilder(builderParam,500,true).then(pm=>{this.builderPixelMap=pm;this.addLog(`createFromBuilder(delay=500) →${pm.getPixelBytesNumber()}bytes`);}).catch((e:Error)=>{this.addLog(`createFromBuilder Error:${e.message}`);});

场景三:截取整个应用窗口

SnapshotUtil.snapshot().then(pm=>{this.addLog(`snapshot() → PixelMap${pm.getPixelBytesNumber()}bytes`);}).catch((e:Error)=>{this.addLog(`snapshot() Error:${e.message}`);});

适合"截图反馈 Bug"功能——用户报问题时,自动截取当前页面截图附上。

场景四:截屏行为监听

监听用户的系统截图操作:

@StateisListening:boolean=false;privatesnapshotListener:VoidCallback=()=>{this.addLog('[系统截图事件] 检测到截屏操作!');};// 开关监听if(this.isListening){SnapshotUtil.removeSnapshotListener(this.snapshotListener);this.isListening=false;this.addLog('removeSnapshotListener(callback) 已关闭截图监听');}else{SnapshotUtil.onSnapshotListener(this.snapshotListener);this.isListening=true;this.addLog('onSnapshotListener() 已开启截图监听,请按下截图键触发...');}

适合聊天应用、隐私内容页面的截图提醒功能。

选型决策树

有截图需求 ├── 需要截取屏幕上已有组件? │ ├── 是 → 给组件加 id │ │ ├── 需要立即拿到结果 → getSync(id) │ │ └── 普通场景 → get(id) │ └── 否 │ ├── 需要动态生成图片(海报、卡片)→ createFromBuilder │ └── 需要截取整个窗口 → snapshot() │ └── 需要监听用户截屏行为?→ onSnapshotListener / removeSnapshotListener

PixelMap 得到后能做什么?

无论用哪种方式拿到PixelMap,后续操作都一样:

// 1. 直接显示Image(this.snapshotPixelMap).width('100%').height(120).objectFit(ImageFit.Contain).backgroundColor('#F0F0F0').borderRadius(8)// 2. 保存为文件(配合 ImageUtil 或 image.ImagePacker)// 3. 分享(传给系统分享面板)// 4. 上传到服务器(先打包成 JPEG/PNG 字节流)

写在最后

SnapshotUtil四个截图功能覆盖了移动应用里绝大多数截图需求。关键是搞清楚:你要截的内容是"已经在屏幕上的"还是"需要动态生成的",然后选对方法。

http://www.jsqmd.com/news/941637/

相关文章:

  • 保姆级教程:用CrewAI+Ollama在本地电脑搭建你的第一个多Agent协作项目(附避坑指南)
  • 社交媒体健康洞察:从数据挖掘到公共健康监测的实践指南
  • Appium Inspector实战:如何高效录制并优化Python自动化脚本(以网易MuMu模拟器为例)
  • 杭州特产避坑指南:双非遗杨先生糕点才是伴手礼天花板,芡实糕 + 麻花闭眼入不踩雷 - 玖叁鹿
  • 3分钟掌握B站视频转文字:你的个人知识管理助手
  • 钢材的品种及规格
  • 选金蝶软件代理前必看的6个判断维度 - 资讯纵览
  • 盐城核心商圈黄金回收套路多,正规渠道这样选才安心 - 黄金上门回收
  • 一种颠覆传统RAG的检索范式,把 RAG 从“向量搜索”变成“推理式检索”
  • MATLAB实现相控阵天气雷达晴空探测仿真:窄波束补盲与宽波束主探对比分析
  • OrCAD CIS数据库配置全攻略:从Access到ODBC,一步一图搞定元器件统一管理
  • HarmonyOS 组件参数类型校验怎么做才对?TypeUtil 全面实战
  • STC8F单片机上基于RTX51 Tiny的三路LED独立闪烁工程(Keil C51可直接编译)
  • Esxi 7.0装好后必做的5件事:从激活许可证到上传ISO镜像的完整配置流程
  • 别再降级Pillow了!YOLOv5 7.0中文标签训练与显示完整避坑指南(附字体配置)
  • 长沙黄金回收实地测评:6家机构检测称重报价全纪实 - 黄金上门回收
  • 闲置猫眼猫享卡如何妥善处置?实用实操回收指南 - 购物卡回收找京尔回收
  • Oracle EBS 的关联交易体系,本质上是一套“以法人合规为边界,以流程自动化为手段,以成本还原为目标
  • Windows Cleaner完整指南:免费开源解决C盘空间不足的终极方案
  • 废纸撕碎机厂家横向解析:2026年废纸回收设备选型全攻略 - 深度智识库
  • 告别拖拽式布局:用SceneBuilder + FXML重构你的JavaFX项目(附完整配置流程)
  • PyQt5样式表扫盲:手把手教你读懂并定制Qt Designer里那段‘神秘代码’(以圆形按钮为例)
  • 小目标检测增强工具集:图像切分+结果拼接+框图可视化(YOLOv5 v6.0+适配)
  • 别再被OneNET应用模拟器卡住:一份给新手的MQTT订阅与属性设置避坑指南
  • 2026深圳添价收名表回收实测:全城高价透明回收,靠谱变现首选 - 薛定谔的梨花猫
  • 21.前端入门必看!猜数字小游戏和表白墙的完整代码实现
  • Egg.js后端+Wechaty微信协议的开箱即用聊天机器人模板
  • 2026滚塑模具制品厂家实力排行榜:本凡机械凭全产业链优势问鼎榜首 - 玖叁鹿
  • 生物识别技术如何解决结核病治疗依从性难题:一个公共卫生领域的创新实践
  • 2026广州荔湾区外贸公司注册攻略|荔湾专业靠谱财税公司推荐 - 资讯速览