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

Flutter 图片编辑板(一) 事件路由

一个图片编辑板,有两部分组成。编辑板和内容项。每一个内容项是被InteractiveViewer修饰的widget,具有缩放偏移的功能。

在图片编辑板上, 会有多个内容相,图片或文字(添加文字目前还没做过)。 当要编辑其中一个项目时,必然需要先选中这个项目。这就牵扯到事件问题。是不是点中哪个看到的项目,这个项目就会发出事件?实际情况是不会的。因为InteractiveViewer的大小是覆盖真个编辑板的,虽然看到的内容项小,其实是占用了所有编辑板的。这就导致事件无法传递给你看到并点击的内容项。

这就需要我们重新实现编辑板的事件路由。

1. 我们在InteractiveViewer再修饰一层GestureDetector。这样就能获取在编辑板上点击的所有事件!

2. 实时计算每一个内容项的事件区域,或者说在编辑板所占位置大小,也就是一个Rect对象。这里要注意缩放问题。

if (widget.transformationController != null &&widget.mergeItemInfo.eventArea != null) {double transX = widget.transformationController!.value.getTranslation().x; //the distance in UI review.double transY = widget.transformationController!.value.getTranslation().y;double scale = widget.transformationController!.value.getMaxScaleOnAxis();Rect eventArea = Rect.fromLTWH(widget.mergeItemInfo.initEventArea!.left * scale + transX,widget.mergeItemInfo.initEventArea!.top * scale + transY,widget.mergeItemInfo.initEventArea!.width * scale,widget.mergeItemInfo.initEventArea!.height * scale);widget.mergeItemInfo.eventArea = eventArea;}

3. 根据点击的事件位置,路由的遍历每一个内容项,查看是否命中,命中就返回事件给这个内容项。

  bool isInEventArea(TapDownDetails details) {Offset point = details.localPosition;if (eventArea != null) {return point.dx >= eventArea!.left &&point.dx <= eventArea!.left + eventArea!.width &&point.dy >= eventArea!.top &&point.dy <= eventArea!.top + eventArea!.height;}return false;}

http://www.lryc.cn/news/500681.html

相关文章:

  • 【Java】—— 图书管理系统
  • 数据库基础入门:从零开始学习数据库的核心概念
  • Y20030002 微信+Java+Jsp+Servlet+MySQL的问卷调查小程序的设计与实现 源代码 配置文档 全套资料
  • ros项目dual_arm_pick-place(urdf文件可视化查看)
  • AI-安全-B站
  • 【C#设计模式(19)——备忘录模式(MementoPattern)】
  • 第三部分:进阶概念 8.事件处理 --[JavaScript 新手村:开启编程之旅的第一步]
  • 工具推荐-js爬取工具
  • Android问题记录 - Inconsistent JVM-target compatibility detected for tasks
  • ejb组件(rmi) webservice平台(xml)
  • 【jvm】垃圾回收的重点区域
  • PyQt信号槽实现页面的登录与跳转 #页面进一步优化
  • 谈谈web3
  • 正则表达式实战例子
  • Hadoop不同版本的区别
  • QtCreator UI界面 菜单栏无法输入中文
  • java switch及其新特性
  • E卷-货币单位换算(100分)
  • 什么是MMD Maximum Mean Discrepancy 最大均值差异?
  • 沐风老师3DMAX摄相机阵列插件使用方法
  • Java Web 开发学习中:过滤器与 Ajax 异步请求
  • 数据结构 (36)各种排序方法的综合比较
  • 使用vue搭建不需要打包的前端项目
  • 发布订阅者=>fiber=>虚拟dom
  • Python-计算机中的码制以及基础运算符(用于分析内存)
  • yum 离线软件安装
  • 【C语言】17. 数据在内存中的存储
  • 二叉树概述
  • 【开源免费】基于SpringBoot+Vue.JS图书进销存管理系统(JAVA毕业设计)
  • 惠普M126a连接共享打印机故障0x000006ba,系统不支持请求的命令,print spooler重复停止