Flutter InteractiveViewer CustomPaint的使用总结

最近产品上有个图片编辑的需求,需要对编辑区域做放大和缩小, 以方便用户编辑图片。做起来远比博主当初预想的要难受。这期间遇到几个问题。一一做一下记录。

如果只是单纯的缩放,没有对缩放的内容进行改变和更新, 那么基本没啥问题。

这是基本的使用。

InteractiveViewer(transformationController: controller,boundaryMargin: const EdgeInsets.all(double.infinity),minScale: 0.5,maxScale: 3.0,constrained: false,scaleEnabled: true,panEnabled: false,onInteractionStart: (ScaleStartDetails details) {if (details.pointerCount > 1) {widget.controller.value.moving = false;// logger//     .i("onInteractionStart,two, ${details.localFocalPoint}");} else {// 单指if (allowDraw) {widget.controller.onDragStartCallback(details, controller, measuredRect,statusBarHeight);// logger.i(//     "onInteractionStart, single, ${details.localFocalPoint}");}}},onInteractionUpdate: (ScaleUpdateDetails details) {// logger.i(//     "onInteractionUpdate,pointerCount, ${details.pointerCount}");if (details.pointerCount > 1) {widget.controller.value.moving = false;// logger//     .i("onInteractionUpdate,two, ${details.localFocalPoint}");allowDraw = false;} else {// 单指if (allowDraw &&details.focalPointDelta != const Offset(0, 0)) {widget.controller.onDragUpdateCallback(details, controller, measuredRect, statusBarHeight);// logger.i(//     "onInteractionUpdate, single, ${details.localFocalPoint}");}}},onInteractionEnd: (ScaleEndDetails details) {// logger.i(//     "onInteractionEnd,pointerCount, ${details.pointerCount}");if (details.pointerCount > 1) {widget.controller.value.moving = false;//  logger.i("onInteractionEnd, two");} else if (details.pointerCount == 1) {} else if (details.pointerCount == 0) {widget.controller.onDragEndCallback(details);allowDraw = true;// logger.i("onInteractionEnd single");}}

下面都是针对CustomPaint缩放导致的问题。

1.drawpath问题, 用drawline/drawpoint替换。

flutter 渲染器,哪怕是最新的impeller都有问题(官网上bug),原因是flutter目前还不能直接控制硬件层。drawPath方法在缩放的情况下,有性能问题,卡帧,掉帧,甚至crash。 说是会有一些计算什么。简单的图形就用drawline/drawpoint实现。如果要用到贝塞尔曲线,那就没有办法了。

2.图层层数尽可能的少。

save()/savelayer(), 尽可能的少调。多了同样会有性能问题,卡帧,掉帧,甚至crash。所以要优化图层。

3.无法缩小。

这个简单,就加上这句代码:

boundaryMargin: const EdgeInsets.all(double.infinity),

4.位置偏移问题。放大缩小后的手指点位置不对。

区域缩放后,手指点击的区域和原图编辑区域,这儿有个映射关系。

    scale = transformationController.value.getMaxScaleOnAxis();//实时double width = details.localFocalPoint.dx -((1.sw - measuredRect.width)*scale/2)-transformationController.value.getTranslation().x;double height = details.localFocalPoint.dy -((1.sh - measuredRect.height)*scale/2)-transformationController.value.getTranslation().y;currentPosition = Offset(width / scale, height / scale);

代码中,实时获取缩放值transformationController.value.getMaxScaleOnAxis(); 而不是回调函数中的参数。那个是基于上次的。

5. shouldRepaint()问题。

在缩放时,CustomPaint会反复刷新,尽可能避免不必要的刷新。做到在缩放时不刷新,在编辑时刷新。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/26298.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

go语言,拼接字符串有哪些方式

目录 第一种方式: 使用加号"" 第二种方式: 使用fmt.Sprintf 第三种方式: 使用strings.Join 第四种方式: 使用strings.Builder 第五种方式: 使用bytes.Buffer go语言,拼接字符串的方式有…

pycharm基本使用(常用快捷键)

0.下载 pycharm官网下载 选择合适的版本,本文以2024.1为例 1.简单应用 常用快捷键 ctrlD 复制当前行 ctrlY 删除当前行 ctrlX 剪切当前行(可用作删除,更顺手) shift↑ 选中多行ctrlshiftF10 运行 shiftF9 调试ctrl/ 注释当前…

数据结构入门:探索数据结构第一步

0.引言 在我们的日常生活中,经常需要管理大量的数据,就譬如学校中有好几千个学生,中国有十三亿人口,对于那么多的数据进行查找、插入、排序等操作就会比较慢。人们为了解决这些问题,提高对数据的管理效率,…

HTML实现进度条/加载框模版

HTML加载 一、环形加载 1二、环形加载 2三、波形加载四、百分比环形五、进度条 一、环形加载 1 <div class"loader"></div>.loader {border: 16px solid #f3f3f3;border-radius: 50%;border-top: 16px solid #3498db;width: 120px;height: 120px;-webki…

JavaScript 在浏览器和 Node.js 里的运行流程

浏览器中的 JavaScript 运行流程 加载与解析 HTML&#xff1a;浏览器首先加载 HTML 文档&#xff0c;并开始解析构建 DOM 树。这一步骤包括下载并解析所有的 HTML 标记。 发现 JavaScript 资源&#xff1a;当浏览器遇到 <script> 标签时&#xff0c;解析过程会暂停并开始…

docker被封禁,怎么拉取镜像,打包所有镜像

因为docker被国内封禁了&#xff0c;所以我把电脑上之前的镜像全部打包出来了 你们也可以打包&#xff0c;我提供一个脚本&#xff0c;你运行即可 export_docker.sh #!/bin/bash# 导出目录 EXPORT_DIR"docker_images_backup" mkdir -p "$EXPORT_DIR"# 获…

Calibre版图验证工具调用_笔记

Siemens EDA Calibre版图验证工具调用 采用Cadence Virtuoso Layout Editor直接调用Siemens EDA Calibre工具需要进行文件设置&#xff0c; 在用户的根目录下&#xff0c;找到.cdsinit文件&#xff0c; 在文件的结尾处添加以下语句即可&#xff0c;其中&#xff0c;calibre.skl…

vue3 computed 返回计算内容

const ItemPercent computed(() > {return (item: any) > {const num item.polishTaskList.filter((row: any) > row.carryOutState 1).lengthreturn (num / item.polishTaskList.length) * 100}}) 我现在有一个列表 列表中有每一项 根据每一项的数据 计算 或显…

Java 中常校验时间格式的方法

前言&#xff1a; 在实际项目开发中&#xff0c;跟时间参数打交道是必不可少的&#xff0c;为了保证程序的安全性、健壮性&#xff0c;一般都会对参数进行校验&#xff0c;其他类型的参数校验很好实现&#xff0c;那你知道时间参数的是怎么校验的吗&#xff1f;估计部分朋友在…

电表抄表软件是什么?

一、电表抄表软件的概念和作用 电表抄表软件&#xff0c;是一种致力于电力企业定制的数字化工具&#xff0c;用以远程控制搜集、管理方法与分析电表数据信息。它取代了传统人工抄表方法&#xff0c;大大提高了工作效率&#xff0c;降低了人为失误&#xff0c;并且能实时监控系…

【html】简单网页模板源码

大家每一次在写网页的时候会不会因为布局而困扰今天就给大家带来一个我自己亲自编写的网页的基本的模板大家可以直接去利用&#xff0c;大家也可以利用自己的想法去做空间的美化和完善。 源码&#xff1a; html: <!DOCTYPE html> <html lang"zh"><…

flask基础3-蓝图-cookie-钩函数-flask上下文-异常处理

目录 一&#xff1a;蓝图 1.蓝图介绍 2.使用步骤 3.蓝图中的静态资源和模板 二.cookie和session 1.cookie 2.flask中操作cookie 3.session 4.session操作步骤 三.请求钩子 四.flask上下文 1.介绍 2.请求上下文&#xff1a; 3.应用上下文 3.g对象 五&#xff1a;…

【Linux】进程控制2——进程等待(waitwaitpid)

1. 进程等待必要性 我们知道&#xff0c;子进程退出&#xff0c;父进程如果不管不顾&#xff0c;就可能造成"僵尸进程”的问题&#xff0c;进而造成内存泄漏。另外&#xff0c;进程一旦变成僵尸状态&#xff0c;那就刀枪不入&#xff0c;“杀人不眨眼”的kill -9 也无能为…

香港户口需要什么条件?有学历要求吗?最新香港落户途径详解!

香港户口需要什么条件&#xff1f;有学历要求吗&#xff1f;最新香港落户途径详解&#xff01; 由于香港放开“落户”窗口&#xff0c;想去香港发展或者想拿香港身份的朋友都想抓住这个机会赶紧申请。 只是&#xff0c;香港户口办理是有条件的&#xff0c;而且有学历要求&…

2024年上海高考作文题目(ChatGPT版)

一、2024年6月7日上海高考作文题目 生活中&#xff0c;人们常用认可度判别事物&#xff0c;区分高下。请写一篇文章&#xff0c;谈谈你对“认可度”的认识和思考。 要求&#xff1a;&#xff08;1&#xff09;自拟题目&#xff1b;&#xff08;2&#xff09;不少于800字。 二、…

Judging LLM-as-a-Judge with MT-Bench and Chatbot Arena阅读笔记

使用 MT-Bench 和 Chatbot Arena 评估 LLM 作为评审的效果 Lianmin Zheng1∗ Wei-Lin Chiang1∗ Ying Sheng4∗ Siyuan Zhuang1 Zhanghao Wu1 Yonghao Zhuang3 Zi Lin2 Zhuohan Li1 Dacheng Li13 Eric P. Xing35 Hao Zhang12 Joseph E. Gonzalez1 Ion Stoica1 1 UC Berkele…

VScode中连接并使用docker容器

前提条件&#xff1a; 1.在windows下安装Docker Desktop(方法可见下面的教程) Docker Desktop 安装使用教程-CSDN博客 2.在vscode安装3个必备的插件 3.先在ubuntu中把docker构建然后运行 4.打开vscode&#xff0c;按下图顺序操作 调试好之后上传到git上&#xff0c;然后后面…

《人人都是产品经理》笔记1:什么是产品?怎么入行?

《人人都是产品经理》笔记1&#xff1a;什么是产品&#xff1f;怎么入行&#xff1f; 产品是什么&#xff1f;产品经理、产品管理&#xff1f;真的想做产品经理吗&#xff1f;全书结构示意图 从写这篇文章开始&#xff0c;是个人第二次对该书进行阅读&#xff0c;在此进行个人的…

[Python学习篇] Python输入

关键字 input 语法&#xff1a;input("提示信息") 特点 当程序执行到input&#xff0c;等待用户输入&#xff0c;输入完成之后才能继续向下执行。input接收用户输入后&#xff0c;一般存储到变量中&#xff0c;方便使用。input会把接收到的任意用户输入的数据都当做…

老杨说运维 | 基于数据驱动的智观能力建设(文末附现场视频)

本期回顾来自擎创科技创始人兼CEO杨辰的现场演讲 青城山脚下的滔滔江水奔涌而过&#xff0c;承载着擎创一往无前的势头&#xff0c;共同去向未来。2024年6月&#xff0c;双态IT成都用户大会擎创科技“数智化可观测赋能双态运维”专场迎来了完满的收尾。 “没有2200年前李冰率众…