Flutter进阶—点击、拖动和其他手势
Flutter中的手势系统有两个层次。第一层具有原始指针事件,其描述了穿过屏幕的指针(例如触摸、鼠标和触控笔)的位置和移动。第二层具有手势,其描述由一个或多个指针移动组成的语义动作。
指针
指针代表用户与设备屏幕交互的原始数据。有四种类型的指针事件:
PointerDownEvent:指针已经在特定位置联系了屏幕。
PointerMoveEvent:指针已经从屏幕上的一个位置移动到另一个位置。
PointerUpEvent:指针已停止接触屏幕。
PointerCancelEvent:此指针的输入不再针对此应用程序。
在指针落下,框架在您的应用程序寻找处理触摸事件的视图,以确定指针与触摸屏接触的位置处存在哪些控件。然后将指针落下事件(以及该指针的后续事件)分派到处理触摸事件的视图的最内层控件。在那里,事件会弹起控件树,并被分派到从最内层控件到树根的路径上的所有小部件。没有取消或停止指针事件进一步调度的机制。
要直接从控件层监听指针事件,可以使用Listener控件。但是,一般来说,最好使用手势(下面会介绍原因)。
手势
手势表示从多个指针事件中识别的语义动作(例如点击、拖动和缩放),甚至可能有多个指针。手势可以调度多个事件,对应于手势的生命周期(例如拖动开始、拖动更新和拖动结束):
点击
onTapDown:可能导致点击的指针已联系到屏幕的特定位置。
onTapUp:触发点按的指针已停止在特定位置与屏幕联系。
onTap:发生了点击。
onTapCancel:以前触发onTapDown的指针最终没有导致点击。
双击
onTapDown:onDoubleTap:用户已经快速连续地在同一位置点击屏幕两次。
长按
onLongPress:指针在相同的位置与屏幕保持的长时间接触。
垂直拖动
onVerticalDragStart:指针已经接触到屏幕,而且可能开始垂直移动。
onVerticalDragUpdate:与屏幕接触并垂直移动的指针沿垂直方向移动。
onVerticalDragEnd:以前与屏幕接触并垂直移动的指针不再与屏幕接触,并且当其停止接触屏幕时以特定速度移动。
水平拖动
onHorizontalDragStart:指针已经接触到屏幕,而且可能开始水平移动。
onHorizontalDragUpdate:与屏幕接触并水平移动的指针沿水平方向移动。
onHorizontalDragEnd:以前与屏幕接触并水平移动的指针不再与屏幕接触,并且当其停止接触屏幕时以特定速度移动。
要从控件层监听手势,可以使用GestureDetector控件。
如果使用质感设计控件,则其中许多控件已经响应了点击或手势。例如,IconButton和FlatButton响应点击,ListView响应滑动来触发滚动。如果没有使用这些控件,但是想要“ink splash”的点击效果,您可以使用InkWell控件。
手势消歧
在屏幕上给定的位置,可能有多个手势检测器。所有这些手势检测器在流过指针事件流时都会监听,并尝试识别特定的手势。GestureDetector控件基于哪个回调非空,决定尝试识别哪些手势。
当屏幕上给定指针有多个手势识别器时,框架通过使每个识别器加手势竞技场来决定用户打算使用哪个手势。手势竞技场使用以下规则决定哪个手势赢:
在任何时候,识别器可以宣布失败并离开竞技场。如果竞技场中只剩下一个识别器,则该识别器是获胜者。
在任何时候,识别器可以宣布胜利,这导致其获胜,所有剩余的识别器都会失败。
例如,当消除水平和垂直拖动的歧义时,当他们收到指针落下事件时,两个识别器进入竞技场。识别器观察指针移动事件。如果用户水平移动指针超过一定数量的逻辑像素,水平识别器将声明胜利,手势将被解释为水平拖动。类似地,如果用户垂直移动超过一定数量的逻辑像素,则垂直识别器将声明胜利。
当只有水平(或垂直)拖动识别器时,手势竞技场是有益的。在这种情况下,竞技场只有一个识别器,水平拖动将被立即识别,这意味着水平移动的第一个像素可以被视为拖动,用户不需要等待进一步的手势消歧。
Flutter进阶—点击、拖动和其他手势的更多相关文章
- 爱了!阿里大神最佳总结“Flutter进阶学习笔记”,理论与实战
前言 "小步快跑.快速迭代"的开发大环境下,"一套代码.多端运行"是很多开发团队的梦想,美团也一样.他们做了很多跨平台开发框架的尝试:React Native. ...
- iOS 轻击、触摸和手势的检测
一.检测捏合手势( UIPinchGestureRecognizer): //设定一个实例变量存储手指之间的其起始距离 @property (assign, nonatomic) CGFloat i ...
- Flutter获取点击元素的位置与大小
使用 WidgetsBindingObserver获取 class CloseTap extends StatefulWidget { @override _CloseTapTapState crea ...
- flutter Dismissible 可以在拖动时隐藏的widget
import 'package:flutter/material.dart'; class DismissedAppPage extends StatefulWidget { @override St ...
- flutter GestureDetector点击区域
使用GestureDetector包裹Container,发现在Container内容为空的区域点击时,捕捉不到onTap点击事件. 解决方案:在GestureDetector里面添加属性: beha ...
- 【Flutter 3-5】Flutter进阶教程——在Flutter中使用Lottie动画
作者 | 弗拉德 来源 | 弗拉德(公众号:fulade_me) Lottie动画 在移动开发中总是需要展示一些动画特效,作为程序员的我们并不是很擅长用代码做动画,即便是有些动画可以实现,在跨平台的过 ...
- python selenium5 模拟点击+拖动+按照指定相对坐标拖动 58同城验证码
#!/usr/bin/python # -*- coding: UTF-8 -*- # @Time : 2019年12月9日11:41:08 # @Author : shenghao/10347899 ...
- python selenium4 模拟点击+拖动+保存验证码 测试对象+以验证码的返回ID保存命名 58同城验证码
#!/usr/bin/python # -*- coding: UTF-8 -*- # @Time : 2019/12/5 17:30 # @Author : shenghao/10347899@qq ...
- python selenium3 模拟点击+拖动+保存验证码 测试对象 58同城验证码
#!/usr/bin/python # -*- coding: UTF-8 -*- # @Time : 2019/12/5 17:30 # @Author : shenghao/10347899@qq ...
随机推荐
- Kruskal || BZOJ 1601: [Usaco2008 Oct]灌水 || Luogu P1550 [USACO08OCT]打井Watering Hole
题面:P1550 [USACO08OCT]打井Watering Hole 题解:无 代码: #include<cstdio> #include<cstring> #includ ...
- 必备Linux命令和C语言基础
每一个学习嵌入式单片机的伙伴我相信对于这两个都不陌生,这毕竟是嵌入式单片机的生存之道 所有基础还是要打牢的 有句老话说的好基础不牢地动山摇 下面看下系统的资料吧 希望能对大家有所帮 ...
- [dev][python] 从python2进阶到python3你都需要了解什么
基于python2快速掌握python3 0. 前言 这是一篇road map. 如果你会python2,读完这篇文章之后,你将掌握python3 1. 为什么会出现python3 Why Pytho ...
- 2018-2019-2 网络对抗技术 20165225 Exp6 信息搜集与漏洞扫描
2018-2019-2 网络对抗技术 20165225 Exp6 信息搜集与漏洞扫描 实践内容 (1)各种搜索技巧的应用 (2)DNS IP注册信息的查询 (3)基本的扫描技术:主机发现.端口扫描.O ...
- NoSQL入门
NoSQL(Not Only SQL)入门: *没有Fixed Schema *没有关系型数据储存在系统中 * 在大数据方面NoSQL有更好的表现 * 支持unstructured data - 不同 ...
- hexo建站报错解决记录
安装某主题依赖 nodejieba 库,该库又依赖 windows-build-tools 和 node-gyp git bash shell 下 cnpm install -g windows-bu ...
- 使用jEnv在Mac/Linux环境配置多版本Java
jEnv 是什么? 先来看一下官方介绍 jEnv is a command line tool to help you forget how to set the JAVA_HOME environm ...
- python数组
1. 初始化一个具有20个元素,元素的值为 1*1, 2*2, 3*3, ......., n*n的数组 A = [i*i for i in range(1, 20)] print A 2. 初始化一 ...
- .net 操作web.config文件
XmlDocument doc = new XmlDocument(); string wc = HttpContext.Request.PhysicalApplicationPath + @&quo ...
- 2017UGUI之slider
不让鼠标控制slider的滑动: 鼠标之所以可以控制滑动是因为slider具有interactable这个属性(下图红色的箭头的地方):如果取消了这个属性的运行的时候就不能滑动了.如果要代码去控制这个 ...