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进阶—点击、拖动和其他手势的更多相关文章

  1. 爱了!阿里大神最佳总结“Flutter进阶学习笔记”,理论与实战

    前言 "小步快跑.快速迭代"的开发大环境下,"一套代码.多端运行"是很多开发团队的梦想,美团也一样.他们做了很多跨平台开发框架的尝试:React Native. ...

  2. iOS 轻击、触摸和手势的检测

    一.检测捏合手势( UIPinchGestureRecognizer):  //设定一个实例变量存储手指之间的其起始距离 @property (assign, nonatomic) CGFloat i ...

  3. Flutter获取点击元素的位置与大小

    使用 WidgetsBindingObserver获取 class CloseTap extends StatefulWidget { @override _CloseTapTapState crea ...

  4. flutter Dismissible 可以在拖动时隐藏的widget

    import 'package:flutter/material.dart'; class DismissedAppPage extends StatefulWidget { @override St ...

  5. flutter GestureDetector点击区域

    使用GestureDetector包裹Container,发现在Container内容为空的区域点击时,捕捉不到onTap点击事件. 解决方案:在GestureDetector里面添加属性: beha ...

  6. 【Flutter 3-5】Flutter进阶教程——在Flutter中使用Lottie动画

    作者 | 弗拉德 来源 | 弗拉德(公众号:fulade_me) Lottie动画 在移动开发中总是需要展示一些动画特效,作为程序员的我们并不是很擅长用代码做动画,即便是有些动画可以实现,在跨平台的过 ...

  7. python selenium5 模拟点击+拖动+按照指定相对坐标拖动 58同城验证码

    #!/usr/bin/python # -*- coding: UTF-8 -*- # @Time : 2019年12月9日11:41:08 # @Author : shenghao/10347899 ...

  8. python selenium4 模拟点击+拖动+保存验证码 测试对象+以验证码的返回ID保存命名 58同城验证码

    #!/usr/bin/python # -*- coding: UTF-8 -*- # @Time : 2019/12/5 17:30 # @Author : shenghao/10347899@qq ...

  9. python selenium3 模拟点击+拖动+保存验证码 测试对象 58同城验证码

    #!/usr/bin/python # -*- coding: UTF-8 -*- # @Time : 2019/12/5 17:30 # @Author : shenghao/10347899@qq ...

随机推荐

  1. Kruskal || BZOJ 1601: [Usaco2008 Oct]灌水 || Luogu P1550 [USACO08OCT]打井Watering Hole

    题面:P1550 [USACO08OCT]打井Watering Hole 题解:无 代码: #include<cstdio> #include<cstring> #includ ...

  2. 必备Linux命令和C语言基础

    每一个学习嵌入式单片机的伙伴我相信对于这两个都不陌生,这毕竟是嵌入式单片机的生存之道    所有基础还是要打牢的   有句老话说的好基础不牢地动山摇    下面看下系统的资料吧   希望能对大家有所帮 ...

  3. [dev][python] 从python2进阶到python3你都需要了解什么

    基于python2快速掌握python3 0. 前言 这是一篇road map. 如果你会python2,读完这篇文章之后,你将掌握python3 1. 为什么会出现python3 Why Pytho ...

  4. 2018-2019-2 网络对抗技术 20165225 Exp6 信息搜集与漏洞扫描

    2018-2019-2 网络对抗技术 20165225 Exp6 信息搜集与漏洞扫描 实践内容 (1)各种搜索技巧的应用 (2)DNS IP注册信息的查询 (3)基本的扫描技术:主机发现.端口扫描.O ...

  5. NoSQL入门

    NoSQL(Not Only SQL)入门: *没有Fixed Schema *没有关系型数据储存在系统中 * 在大数据方面NoSQL有更好的表现 * 支持unstructured data - 不同 ...

  6. hexo建站报错解决记录

    安装某主题依赖 nodejieba 库,该库又依赖 windows-build-tools 和 node-gyp git bash shell 下 cnpm install -g windows-bu ...

  7. 使用jEnv在Mac/Linux环境配置多版本Java

    jEnv 是什么? 先来看一下官方介绍 jEnv is a command line tool to help you forget how to set the JAVA_HOME environm ...

  8. python数组

    1. 初始化一个具有20个元素,元素的值为 1*1, 2*2, 3*3, ......., n*n的数组 A = [i*i for i in range(1, 20)] print A 2. 初始化一 ...

  9. .net 操作web.config文件

    XmlDocument doc = new XmlDocument(); string wc = HttpContext.Request.PhysicalApplicationPath + @&quo ...

  10. 2017UGUI之slider

    不让鼠标控制slider的滑动: 鼠标之所以可以控制滑动是因为slider具有interactable这个属性(下图红色的箭头的地方):如果取消了这个属性的运行的时候就不能滑动了.如果要代码去控制这个 ...