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

flutter开发实战-RepaintBoundary实现Widget截图功能

flutter开发实战-RepaintBoundary实现Widget截图功能

在开发中,遇到需要使用截图,像iOS可以截图UIView获取到UIImage,在flutter中可以使用RepaintBoundary实现截图功能

相机拍摄的图片:
在这里插入图片描述

RepaintBoundary截图后的图片
在这里插入图片描述

一、RepaintBoundary

RepaintBoundary是绘制边界。

如果CustomPaint有子节点,为了避免子节点不必要的重绘并提高性能,通常情况下都会将子节点包裹在RepaintBoundary组件中,这样会在绘制时就会创建一个新的绘制层(Layer),其子组件将在新的Layer上绘制,而父组件将在原来Layer上绘制,也就是说RepaintBoundary 子组件的绘制将独立于父组件的绘制,RepaintBoundary会隔离其子节点和CustomPaint本身的绘制边界。示例如下:


CustomPaint(size: Size(300, 300), //指定画布大小painter: MyPainter(),child: RepaintBoundary(child:...)), 
)

参考:https://book.flutterchina.club/chapter10/custom_paint.html#_10-4-1-custompaint

二、实现Widget截图

实现Widget截图,需要将Widget嵌套在RepaintBoundary里,需要用到Globalkey
示例如下

Container(width: widget.width,height: widget.height,clipBehavior: Clip.hardEdge,decoration: BoxDecoration(color: Colors.transparent,),child: RepaintBoundary(key: _cameraViewGlobalKey,child: Transform.scale(scale: scale * aspectRatio,child: AspectRatio(aspectRatio: aspectRatio,child: Center(child: CameraPreview(controller!,),),),),),);

实现截图功能

// 根据GlobalKey来截图Widgetstatic Future<Uint8List?> makeImageUInt8List(GlobalKey globalKey) async {RenderRepaintBoundary boundary =globalKey.currentContext?.findRenderObject() as RenderRepaintBoundary;// 这个可以获取当前设备的像素比var dpr = ui.window.devicePixelRatio;ui.Image image = await boundary.toImage(pixelRatio: dpr);ByteData? byteData = await image.toByteData(format: ui.ImageByteFormat.png);Uint8List? pngBytes = byteData?.buffer.asUint8List();return pngBytes;}

获得Uint8List,可以直接将其写入文件或者使用Image展示。

          if (uInt8List != null) {await File(imagePath).writeAsBytes(uInt8List);}

三、小结

flutter开发实战-RepaintBoundary实现Widget截图功能,像iOS可以截图UIView获取到UIImage,在flutter中可以使用RepaintBoundary实现截图功能。

相关文章:

flutter开发实战-RepaintBoundary实现Widget截图功能

flutter开发实战-RepaintBoundary实现Widget截图功能 在开发中&#xff0c;遇到需要使用截图&#xff0c;像iOS可以截图UIView获取到UIImage&#xff0c;在flutter中可以使用RepaintBoundary实现截图功能 相机拍摄的图片&#xff1a; RepaintBoundary截图后的图片 一、Re…...

vue中路由懒加载的写法

为什么需要路由懒加载&#xff1f; 当打包构建应用时&#xff0c;JavaScript 包会变得非常大&#xff0c;影响页面加载。如果我们能把不同路由对应的组件分割成不同的代码块&#xff0c;然后当路由被访问的时候才加载对应组件&#xff0c;这样就会更加高效。 懒加载写法 写法…...

【Spring MVC】小文件上传的多种方法

文章目录 方法参数单文件上传1. MultipartFile 的 transferTo(File dest)2. MultipartFile 的 transferTo(Path dest)3. MultipartFile Files.write(Path path, byte[] bytes, OpenOption... options)4. MultipartFile Files.copy(InputStream in, Path target, CopyOption..…...

UE5.1移动端PreintegratedSkinBxDF解析

Part 1 头文件 MobileBasePassPixelShader.usf 主要看Main函数&#xff1a; #if MOBILE_MULTI_VIEWResolvedView ResolveView(BasePassInterpolants.MultiViewId); #elseResolvedView ResolveView(); #endif这玩意Shader文件找不到&#xff0c;感觉是个全局变量的东西。万幸…...

WebSocket心跳机制(笔记大全)

一、WebSocket心跳机制前端 前端实现WebSocket心跳机制的方式主要有两种&#xff1a; 使用setInterval定时发送心跳包。在前端监听到WebSocket的onclose()事件时&#xff0c;重新创建WebSocket连接。 第一种方式会对服务器造成很大的压力&#xff0c;因为即使WebSocket连接正…...

Spring Boot日志:SLF4J和Logback

日志的分类 SpringBoot中的日志库分为两种&#xff1a; 实现库&#xff1a;提供具体的日志实现&#xff0c;例如日志级别的控制、打印格式、输出目标等。外观库&#xff1a;自身不提供日志实现&#xff0c;而是对其他日志库进行封装&#xff0c;从而方便使用。基于外观模式实…...

[C++] C++入门第二篇 -- 引用 -- 内联函数inline -- auto+for

目录 1、引用 -- & 1.1 引用的概念 1.2 引用特性 1.3 常引用 -- 权限问题 1.4 引用的使用场景 1.4.1 做参数 1.4.2 做返回值 注意 1.5 传值、传引用的效率比较 1.6 引用和指针的区别 2、内联函数 2.1 概念 转存失败重新上传取消​编辑转存失败重新上传取消​编…...

Latex | 将MATLAB图并导入Latex中的方法

一、问题描述 用Latex时写paper时&#xff0c;要导入MATLAB生成的图进去 二、解决思路 &#xff08;1&#xff09;在MATLAB生成图片的窗口中&#xff0c;导出.eps矢量图 &#xff08;2&#xff09;把图上传到overleaf的目录 &#xff08;3&#xff09;在文中添加相应代码 三…...

JSON格式Python,Java,PHP等封装根据关键词搜索获取淘宝商品列表数据API

淘宝是一个网上购物平台&#xff0c;售卖各类商品&#xff0c;包括服装、鞋类、家居用品、美妆产品、电子产品等。要用关键词搜索获取淘宝天猫商品列表&#xff0c;您可以通过开放平台的接口或者直接访问淘宝天猫商城的网页来获取商品列表详细信息。以下是两种常用方法的介绍&a…...

MySQL MHA高可用配置及故障切换

文章目录 一.MySQL MHA1.什么是MHA&#xff12;.&#xff2d;&#xff28;&#xff21;的组成&#xff12;.&#xff11;MHA Node (数据节点)&#xff12;.&#xff12;MHA Manager (管理节点) &#xff13;.&#xff2d;&#xff28;&#xff21;的特点&#xff14;.&#xf…...

PHP8知识详解:PHP8开发工具VS Code的安装

作为PHP8的开发工具有很多&#xff0c;具有IDE功能的有phpstorm、Visual Studio Code、Sublime Text、NetBeans、Eclipse、Codelobster、PHP Designer等&#xff0c;当然还有很多轻量的工具&#xff0c;比如Notepad、Editplus等。本文给你介绍的是万能编辑器Visual Studio Code…...

Sui Move与标准Move的有哪些区别和根本性创新

Sui网络将Sui Move作为其本地编程语言&#xff0c;使用Sui Move编写的apps利用Sui的共识机制&#xff0c;实现了令人印象深刻的交易性能。 然而&#xff0c;熟悉Move编程语言的开发者在探索Sui文档时可能会感到困惑&#xff0c;因为该文档着重介绍了对象和一些指令&#xff0c…...

构建自己的ChatGPT:从零开始构建个性化语言模型

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…...

【react】react18的学习(十二)– 底层原理(二)之 迭代器 iterator

迭代器iterator 是一种 ES6 规范&#xff0c;具有这种机制的数据结构才可以使用for of循环&#xff1a;返回每一项的值&#xff1b; 原型链具有Symbol.iterator属性的数据结构都具备&#xff1b;如数组、部分类数组、字符串等&#xff1b; 普通对象就不能用&#xff1b; for-…...

一遍过JavaSE基础知识

文章目录 前言安装Java Development Kit (JDK)安装jdk配置开发环境验证是否安装配置成功 编写第一个Java程序hello world运行Java程序的流程 数据类型和变量数据类型变量 程序逻辑控制条件语句循环语句跳转语句 数组声明和创建数组访问数组元素数组长度遍历数组多维数组 面向对…...

【云原生】Kubernetes之ConfigMap

ConfigMap ConfigMap 是一种 API 对象&#xff0c;用来将非机密性的数据保存到键值对中。使用时&#xff0c; Pods 可以将其用作环境变量、命令行参数或者存储卷中的配置文件 ConfigMap 将你的环境配置信息和 容器镜像 解耦&#xff0c;便于应用配置的修改 说明&#xff1a;…...

8.python设计模式【组合模式】

内容&#xff1a;将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。角色&#xff1a; 抽象组建&#xff08;component&#xff09;叶子组建(Leaf)复合组建(Composite)客户端 (Client) UML 图 举个例子 需求&#xf…...

tkinter制作任意图形窗口

import tkinter from PIL import Image, ImageTkdog tkinter.Tk() # 设置图片描绘的坐标&#xff0c;注意乘号是字母x dog.geometry(500x500200100) # 不允许修改大小 dog.resizable(False, False) # 不显示标题栏 dog.overrideredirect(True) # 设置白色透明色&#xff0c;这…...

视频监控综合管理平台EasyCVR多分屏默认播放协议的配置优化

视频监控综合管理平台EasyCVR具备视频融合汇聚能力&#xff0c;TSINGSEE青犀视频平台基于云边端一体化架构&#xff0c;可支持多协议、多类型设备接入&#xff0c;包括&#xff1a;NVR、IPC、视频编码器、无人机、车载设备、智能手持终端、移动执法仪等。国标GB28181视频平台Ea…...

2023杭电多校第三场 1012.Noblesse Code

传送门:Vjudge 前题提要:一道挺有意思的数论题.赛时对于这道题没什么想法,但是赛后细品之后其实感觉也就那么一回事.但是这种 更相损减术与辗转相除法 相转化的题目还是有点典的,需要好好消化一下. 首先看完题目.我们需要考虑的是 ( A , B ) (A,B) (A,B)与 ( a , b ) (a,b) (…...

字符串匹配:KMP 不用死记,图解+一步一步推导

字符串匹配&#xff1a;KMP 不用死记&#xff0c;一步一步推导彻底理解 KMP 算法的设计思想&#xff0c;从此不再害怕手写 next 数组前言 字符串匹配是计算机科学中最基础、最常用的问题之一&#xff0c;广泛应用于搜索引擎、文本编辑、病毒检测、DNA序列分析等场景。其核心需求…...

华硕笔记本性能控制终极方案:G-Helper完全指南

华硕笔记本性能控制终极方案&#xff1a;G-Helper完全指南 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, Strix, Scar, and…...

PADS Layout VX.2.2 - 贴片元器件坐标导出与Excel解析实战

1. 从PADS Layout导出贴片坐标的完整流程 第一次用PADS Layout导出坐标文件时&#xff0c;我对着那个CAM Plus对话框研究了半天——到底该选哪个格式&#xff1f;输出文件怎么变成Excel&#xff1f;这些坑我都踩过。现在就把最稳的操作流程分享给你&#xff0c;保证5分钟搞定。…...

Python MCP服务器开发模板演进史(2026 LTS版首次开源:含OpenTelemetry 1.28+LLM Gateway内核)

第一章&#xff1a;Python MCP服务器开发模板2026 LTS版核心定位与演进动因 Python MCP&#xff08;Modular Control Protocol&#xff09;服务器开发模板2026 LTS版并非一次简单版本迭代&#xff0c;而是面向工业级长周期运维场景的战略性重构。其核心定位是构建**可验证、可审…...

OpenMMLab 环境配置避坑指南:从 ModuleNotFoundError 到 YOLO 模型成功部署

1. 环境配置的常见报错与诊断方法 当你第一次尝试在OpenMMLab框架下运行YOLO模型时&#xff0c;ModuleNotFoundError可能是最令人头疼的拦路虎。这个报错看似简单&#xff0c;背后却可能隐藏着多种环境配置问题。我最近在帮团队新人配置环境时&#xff0c;就遇到了至少三种不同…...

Legacy-iOS-Kit:让旧款iOS设备重获新生的开源工具完整指南

Legacy-iOS-Kit&#xff1a;让旧款iOS设备重获新生的开源工具完整指南 【免费下载链接】Legacy-iOS-Kit An all-in-one tool to restore/downgrade, save SHSH blobs, jailbreak legacy iOS devices, and more 项目地址: https://gitcode.com/gh_mirrors/le/Legacy-iOS-Kit …...

OpenClaw+千问3.5-9B自动化测试:3种Python脚本异常处理方案

OpenClaw千问3.5-9B自动化测试&#xff1a;3种Python脚本异常处理方案 1. 为什么需要AI辅助的异常处理&#xff1f; 上周我在维护一个Python自动化测试套件时遇到了典型困境&#xff1a;凌晨3点被报警短信吵醒&#xff0c;发现某个核心测试脚本因SSL证书过期而崩溃。更糟糕的…...

MATLAB App Designer打包实战:从GUI到独立安装包的完整部署指南

1. MATLAB App Designer打包前的准备工作 第一次把MATLAB开发的GUI程序打包成独立安装包时&#xff0c;我踩了不少坑。记得当时给合作方演示算法&#xff0c;对方电脑没有MATLAB环境&#xff0c;只能干着急。后来花了三天时间才搞明白整个打包流程&#xff0c;现在把这些经验系…...

抠图怎么让边缘自然?别自己拿大剪刀,让工具替你“绣花”

还在大刀阔斧自己“操刀”抠图吗&#xff1f;边缘不是模糊发虚就是抠不干净&#xff0c;留着一圈难看的毛边&#xff0c;修来修去还是假得明显&#xff0c;纯属浪费时间。其实抠图怎么让边缘自然&#xff0c;找对合适工具就能让它替你“绣花”般精细抠图&#xff0c;比自己拿“…...

终极Win11Debloat指南:如何快速优化Windows 11系统性能

终极Win11Debloat指南&#xff1a;如何快速优化Windows 11系统性能 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter and c…...