监听手指是否离开屏幕android_Flutter事件监听

726454d11ca64962fa668ad7ec532091.png

一. 事件监听

在大前端的开发中,必然存在各种各样和用户交互的情况:比如手指点击、手指滑动、双击、长按等等。
所有内容首发于公众号:coderwhy

在Flutter中,手势有两个不同的层次:

  • 第一层:原始指针事件(Pointer Events):描述了屏幕上由触摸板、鼠标、指示笔等触发的指针的位置和移动。
  • 第二层:手势识别(Gesture Detector):这个是在原始事件上的一种封装。
    • 比如我们要监听用户长按,如果自己封装原始事件我们需要监听从用户按下到抬起的时间来判断是否是一次长按事件;
    • 比如我们需要监听用户双击事件,我们需要自己封装监听用户两次按下抬起的时间间隔;
    • 幸运的是各个平台几乎都对它们进行了封装,而Flutter中的手势识别就是对原始指针事件的封装;
    • 包括哪些手势呢?比如点击、双击、长按、拖动等

2.1. 指针事件Pointer

Pointer 代表的是人机界面交互的原始数据。一共有四种指针事件:

  • PointerDownEvent 指针在特定位置与屏幕接触
  • PointerMoveEvent 指针从屏幕的一个位置移动到另外一个位置
  • PointerUpEvent 指针与屏幕停止接触
  • PointerCancelEvent 指针因为一些特殊情况被取消

Pointer的原理是什么呢?

  • 在指针落下时,框架做了一个 hit test 的操作,确定与屏幕发生接触的位置上有哪些Widget以及分发给最内部的组件去响应;
  • 事件会沿着最内部的组件向组件树的根冒泡分发;
  • 并且不存在用于取消或者停止指针事件进一步分发的机制;

原始指针事件使用Listener来监听:

class HomeContent extends StatelessWidget {@overrideWidget build(BuildContext context) {return Center(child: Listener(child: Container(width: 200,height: 200,color: Colors.red,),onPointerDown: (event) => print("手指按下:$event"),onPointerMove: (event) => print("手指移动:$event"),onPointerUp: (event) => print("手指抬起:$event"),),);}
}

11fd7db1402b395edaa8ee66305c49e3.png

2.2. 手势识别Gesture

Gesture是对一系列Pointer的封装,官方建议开发中尽可能使用Gesture,而不是Pointer

b8b91aca4ff84b69d6c1472ed530e0f3.png

Gesture分层非常多的种类:

点击

  • onTapDown:用户发生手指按下的操作
  • onTapUp:用户发生手指抬起的操作
  • onTap:用户点击事件完成
  • onTapCancel:事件按下过程中被取消

双击:

  • onDoubleTap:快速点击了两次

长按:

  • onLongPress:在屏幕上保持了一段时间

纵向拖拽:

  • onVerticalDragStart:指针和屏幕产生接触并可能开始纵向移动;
  • onVerticalDragUpdate:指针和屏幕产生接触,在纵向上发生移动并保持移动;
  • onVerticalDragEnd:指针和屏幕产生接触结束;

横线拖拽:

  • onHorizontalDragStart:指针和屏幕产生接触并可能开始横向移动;
  • onHorizontalDragUpdate:指针和屏幕产生接触,在横向上发生移动并保持移动;
  • onHorizontalDragEnd:指针和屏幕产生接触结束;

移动:

  • onPanStart:指针和屏幕产生接触并可能开始横向移动或者纵向移动。如果设置了 onHorizontalDragStart 或者 onVerticalDragStart,该回调方法会引发崩溃;
  • onPanUpdate:指针和屏幕产生接触,在横向或者纵向上发生移动并保持移动。如果设置了 onHorizontalDragUpdate 或者 onVerticalDragUpdate,该回调方法会引发崩溃。
  • onPanEnd:指针先前和屏幕产生了接触,并且以特定速度移动,此后不再在屏幕接触上发生移动。如果设置了 onHorizontalDragEnd 或者 onVerticalDragEnd,该回调方法会引发崩溃。

从Widget的层面来监听手势,我们需要使用:GestureDetector

  • 当然,我们也可以使用RaisedButton、FlatButton、InkWell等来监听手势
  • globalPosition用于获取相对于屏幕的位置信息
  • localPosition用于获取相对于当前Widget的位置信息
class HYHomePage extends StatelessWidget {@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text("手势测试"),),body: GestureDetector(child: Container(width: 200,height: 200,color: Colors.red,),onTap: () {},onTapDown: (detail) {print(detail.globalPosition);print(detail.localPosition);},onTapUp: (detail) {print(detail.globalPosition);print(detail.localPosition);}),);}
}

5b73f799f67fb76cba42ddab47303188.png

二. 跨组件事件

在组件之间如果有事件需要传递,一方面可以一层层来传递,另一方面我们也可以使用一个EventBus工具来完成。

其实EventBus在Vue、React中都是一种非常常见的跨组件通信的方式:

  • EventBus相当于是一种订阅者模式,通过一个全局的对象来管理;
  • 这个EventBus我们可以自己实现,也可以使用第三方的EventBus;

这里我们直接选择第三方的EventBus:

dependencies:event_bus: ^1.1.1

第一:我们需要定义一个希望在组件之间传递的对象:

  • 我们可以称之为一个时间对象,也可以是我们平时开发中用的模型对象(model)
class UserInfo {String nickname;int level;UserInfo(this.nickname, this.level);
}

第二:创建一个全局的EventBus对象

final eventBus = EventBus();

第三:在某个Widget中,发出事件:

class HYButton extends StatelessWidget {@overrideWidget build(BuildContext context) {return RaisedButton(child: Text("HYButton"),onPressed: () {final info = UserInfo("why", 18);eventBus.fire(info);},);}
}

第四:在某个Widget中,监听事件

class HYText extends StatefulWidget {@override_HYTextState createState() => _HYTextState();
}class _HYTextState extends State<HYText> {String message = "Hello Coderwhy";@overridevoid initState() {super.initState();eventBus.on<UserInfo>().listen((data) {setState(() {message = "${data.nickname}-${data.level}";});});}@overrideWidget build(BuildContext context) {return Text(message, style: TextStyle(fontSize: 30),);}
}
备注:所有内容首发于公众号,之后除了Flutter也会更新其他技术文章,TypeScript、React、Node、uniapp、mpvue、数据结构与算法等等,也会更新一些自己的学习心得等,欢迎大家关注

84b3d02db311b7ec23559fc83f8e6927.png

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

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

相关文章

@excel注解_Excel导入导出Java解决方案推荐

今天锋哥介绍一款Excel导入导出Java解决方案Easy-POI&#xff0c;以前我们用POI&#xff0c;麻烦点&#xff0c;Easy-POI是封装好的&#xff0c;用起来Easy点&#xff0c;封装过&#xff0c;性能好&#xff0c;所以大伙有空可以研究下&#xff1b;Easy-POIEasy-POI是一款Excel导…

wind 下装mysql,windows 下安装MySQL

下载压缩包首先到官网下载安装包,可联系提供配置环境变量找到系统属性(windows10在高级系统设置)在这里插入图片描述找到系统变量的 Path 点击编辑在这里插入图片描述点击新建&#xff0c;然后添加进去自己压缩包位置的bin目录在这里插入图片描述之后点击三个确当 (同时自动关闭…

打开word2007总是出现配置进度_实战经验:Word 2007每次打开都弹出正在配置

在一次清理注册表之后&#xff0c;发现每次打开Word 2007时&#xff0c;都会弹出”正在配置”的对话框。经过实验&#xff0c;发现可以使用如下的方法解决此问题&#xff1a;1) 打开cmd命令行2) 对于Word 2007&#xff0c;执行如下的指令&#xff1a;reg add HKCUSoftwareMicro…

chrome github上不去 mac_码农大叔打赌,github上快速搜索优质开源项目,这些技能你不懂?...

GitHub的流行&#xff0c; GitHub在开源世界的受欢迎程度自不必多言。再加上今天&#xff0c;GitHub官方又搞了个大新闻&#xff1a;私有仓库也改为免费使用&#xff0c;这在原来可是需要真金白银的买的。可见微软收购后&#xff0c;依然没有改变 GitHub 的定位&#xff0c;甚至…

matlab保存数据到excel_Excel意外退出数据未保存?这个方法可以帮你找回所有数据...

老师们每天都需要完成大量的教学工作&#xff0c;且他们的每一个工作都是跟文字或数据打交道&#xff0c;Excel也逐渐成为了大家日常办公中的必备软件。在利用Excel办公时&#xff0c;通常是这么一个操作流程——新建、编辑、保存。编辑的时间可能是几分钟&#xff0c;也可能是…

c 调用matlab文件路径,C/C++下调用matlab函数操作说明

1.matlab的安装连接&#xff1a;http://pan.baidu.com/s/1qXuF7aO安装32位版本的matlab(在目录下bin文件夹中有两个文件夹&#xff0c;选择win32文件夹下的setup进行安装)2.matlab mex编译器配置安装完matlab之后&#xff0c;需要设定对应的c编译器才能编译.m文件生成可供c调用…

linux tomcat环境变量配置_Tomcat

Tomcat介绍1.Web服务器介绍Web服务器可以解析HTTP协议&#xff0c;收到请求后可以进行响应&#xff0c;比如响应静态资源、进行页面跳转等Web服务器响应可委托给CGI脚本、JSP脚本、ASP脚本、服务器端JS等程序或其它服务器端技术Web服务器通常产生一个html响应以便浏览器浏览2.常…

一直未运行_【直击一线】延一转三相分离器投运成功,盘活全区生产运行一盘棋...

喜 讯4月30日上午17点30点&#xff0c;新安边作业区延一接转注水站上新更换的三相分离器一次投运成功&#xff0c;这个好消息不胫而走传遍了全区收获获赞声一片&#xff0c;这也是对连日来奋战在施工作业现场的新安边人最大的褒奖。 延一接转注水站全貌延一接转注水站是新安边…

python字符串长度_在python中如何获取字符串的长度

python中如何获取字符串的长度&#xff1f;本篇文章就给大家介绍4种在python中计算并输出字符串长度的方法。有一定的参考价值&#xff0c;有需要的朋友可以参考一下&#xff0c;希望对你们有所帮助。 Python中的字符串是Unicode代码点的不可变序列。给定一个字符串&#xff0c…

oracle rowed,oracle bitmap索引内部揭密,欢迎补充

位图(bitmap)索引是另外一种索引类型&#xff0c;它的组织形式与B树索引相同&#xff0c;也是一棵平衡树。与B树索引的区别在于叶子节点里存放索引条目的方式不同。从前面我们知道&#xff0c;B树索引的叶子节点里&#xff0c;对于表里的每个数据行&#xff0c;如果被索引列的值…

asp.mvc 4项目发布文件目录结构_Spring Boot项目搭建与启动

Spring Boot简介Spring Boot是由Pivotal团队提供的全新框架&#xff0c;其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置&#xff0c;从而使开发人员不再需要定义样板化的配置。通过这种方式&#xff0c;Spring Boot致力于在蓬勃发…

windows7系统适合哪个python_Python3.6.4在Windows7系统下安装配置教程

Python3.64在Windows7系统下安装配置教程 工具/原料 Windows7系统 python3.6.4版本 方法/步骤 1 双击应用程序打开如图所示的界面这里是应用程序向导界面 这里建议勾选底部的自动写入path&#xff0c;然后点击自定义选项&#xff08;如图&#xff09;&#xff08;当然你也可以选…

php软删除代码,PHP laeavel软删除以及软删除还原 易错点

PHP laeavel软删除以及软删除还原 易错点PHP laeavel软删除以及软删除还原 易错点首先 数据库字段添加deleted_at字段然后在模型层中引入 SoftDeletes类 并引用use Illuminate\Database\Eloquent\SoftDeletes;控制器正常执行删除代码//软删除public function del(int $id){//$r…

为何控件删除不了_过不好又离不了的婚姻,不如这样去处理

你是否常常感慨&#xff0c;走过了那么长的路&#xff0c;看遍了那么多的繁花&#xff0c;听过了那么多的道理&#xff0c;却依然过不好这一生&#xff1f;明明已经很用心的去生活了&#xff0c;明明已经尽了最大的努力了&#xff0c;生活依然如同一团乱麻&#xff0c;处理不好…

单基因gsea_10个细胞系仅1个表达你的基因

遇到了粉丝的一个超级好的问题&#xff1a;感兴趣的一个基因A&#xff0c;研究它在10种乳腺癌细胞系中的表达情况&#xff0c;跑了western和qpcr 。 发现它只在一种乳腺癌细胞系中表达&#xff0c;其他9种都不表达。 结果是一致的&#xff0c;确认自己的实验没有问题&#xff…

oracle修改成olap模式,的Oracle OLAP Java实现 - 正确源加入

为此&#xff0c;我使用的是默认的模式/例如从Oracle OLAP下载部分GLOBAL 。这是从Oracle OLAP的Java引导代码的修改后的版本&#xff1a;MdmCube unitsCube (MdmCube)mdmDBSchema.getTopLevelObject("PRICE_CUBE_AWJ");MdmBaseMeasure mdmUnits (MdmBaseMeasure)uni…

c 定义结构体时提示应输入声明_C++|了解结构体的内存对齐(成员声明的顺序影响占用空间大小)...

我们使用的电子计算机绝大部分都是冯诺依曼结构的机器&#xff0c;遵循“存储程序”的概念。数据处理以存储为前提&#xff0c;在编程中数据如何“存得进去&#xff0c;取得出来”&#xff0c;并且符合空间、时间效率的要求&#xff0c;在考虑数据结构和算法时&#xff0c;都要…

linux 找不到php命令,bash scp:未找到命令的解决方法

scp命令用于通过ssh在两台服务器之间传输文件。大多数scp用户在系统中已经可以使用scp命令&#xff0c;但它仍然显示“bash:scp:command not found”。因此注意&#xff0c;scp命令必须在本地和远程系统上都可用才可以避免这个问题。安装SCP命令包scp命令来自Red Hat系统上的op…

Redis数据库——键过期时间

一.设置键的生存时间或者过期时间 我们可以在Redis客户端输入命令&#xff0c;可以以秒或者毫秒精度为数据库中的某个键设置生存时间&#xff0c;在指定秒数或者毫秒数之后&#xff0c;服务器会自动删除生存时间为0的键。 1.1 设置过期时间 Redis有四个不同的命令可以用于设置键…

linux 系统配额管理功能,Linux磁盘配额管理

前言&#xff1a;磁盘配额是一种磁盘空间的管理机制&#xff0c;使用磁盘配额可限制用户或组在某个特定文件系统中所能使用的最大空间。Linux系统是多用户任务操作系统&#xff0c;在使用系统时&#xff0c;会出现多用户共同使用一个磁盘的情况&#xff0c;如果其中少数几个用户…