【交互 widget】Flutter GestureDetector

简介: 【交互 widget】Flutter GestureDetector

image.png

一个能识别手势的 widget。相比于 Listener,GestureDetector,更加常用。

GestureDetector 介绍

GestureDetector 就不分析源码了,有兴趣的同学可以读下这篇 从源码看flutter(五):GestureDetector篇。简单的介绍下,GestureDetector 是一个 StateFulWidget,内部调用 RawGestureDetector,RawGestureDetector 又调用 Listener 监听 onPointerDown 和 onPointerPanZoomStart 事件。GestureDetector 作用仅是简化 RawGestureDetector 的使用。作为平时使用 GestureDetector 的功能就足够了。哪天如果不能满足的时候,再去找 RawGestureDetector。

使用 GestureDetector

GestureDetector 使用了很多手势识别器,最常用的就是 TapGestureRecognizer 了,使用起来很简单。

GestureDetector(
 onTap: () {
   print('tap');
 },
 child: Container(
   width: 100,
   height: 100,
   color: Colors.blue,
 ))
复制代码

如果没有 child 要响应 pointer 事件,需要指定 behavior。

GestureDetector(
    behavior: HitTestBehavior.opaque,
    onTap: () {
      debugPrint('tap');
    },
 );
复制代码

opaque 的含义在 Listener 中有讲。

其它手势也都一样,使用还是很简单的,真正需要我们关心的是手势冲突。

有多个手势竞争的时候,child 的手势会胜出

GestureDetector(
      onTap: () {
        debugPrint('tap parent');
      },
      child: GestureDetector(
        behavior: HitTestBehavior.opaque,
        onTap: () {
          debugPrint('tap child');
        },
      ),
    );
复制代码

只输出 tap child。 当 parent 和 child 同时响应 onTap 时, child 胜出。当有多个手势参与竞争的时候,需要竞技场管理者进行裁决。当 pointer up 事件发出的时候,竞技场管理者判定第一个位置的 tap 手势选手胜出。在执行 hitTest 的时候,是深度优先,所以 child 会先加入 结果列表,位置一定在 parent 前面。

pointer move 事件会打断 tap

GestureDetector(
      behavior: HitTestBehavior.opaque,
      onHorizontalDragEnd: (details) {
        debugPrint('darg end');
      },
      onTapDown: (details) {
        debugPrint('tap down');
      },
      onTap: () {
        debugPrint('tap');
      },
    );
复制代码

如果有滑动手势胜出,输出 “tap down” 和 “move end”。

pointer down 后在一定时间内滑动超过一定距离,那么就会被判定为 PointerMoveEvent,tap 手势被移出竞技场。tapUp 和 tap 事件不会再响应。tapDown 会响应,因为 tapDown 在 pointerDownEvent 的时候就被裁决出来了。

同时存在 tap ,doubleTap

只有 tap 的时候,pointer up 的时候,立即执行,如果同时存在 double tap,需要等上 300ms,因为要判断是否要响应 double tap。tap ,doubleTap 只能有一个胜出。

同时存在 tap ,onLongPress

如果同时存在 tap,onLongPress,需要等上 500ms,因为要判断是否要响应 longPress。tap ,onLongPress 只能有一个胜出。

虽然只举这几个例子,但当多个手势竞争的时候必然会有冲突,解决冲突可以用 Listener 替代。

IAM17
+关注
目录
打赏
0
0
0
0
1
分享
相关文章
|
11月前
|
flutter GestureDetector 的 behavior属性
【8月更文挑战第21天】
173 4
|
7月前
|
Flutter Widget 解析
Flutter Widget 解析
Flutter 有状态Widget 和 无状态Widget
Flutter 有状态Widget 和 无状态Widget
101 0
|
8月前
深入理解Flutter鸿蒙next版本 中的Widget继承:使用extends获取数据与父类约束
本文详细介绍了Flutter中如何通过继承其他Widget来创建自定义组件。首先解释了Widget继承的基本概念,包括StatelessWidget和StatefulWidget的区别。接着通过具体示例展示了如何继承StatelessWidget和StatefulWidget,并在子类中访问父类的build方法和状态。最后,结合多个自定义Widget展示了如何在实际应用中灵活使用继承和组合来构建复杂的UI。
174 8
|
8月前
|
flutter&鸿蒙next 使用 InheritedWidget 实现跨 Widget 传递状态
在 Flutter 中,状态管理至关重要。本文详细介绍了如何使用 InheritedWidget 实现跨 Widget 的状态传递。InheritedWidget 允许数据在 Widget 树中向下传递,适用于多层嵌套的场景。通过一个简单的计数器示例,展示了如何创建和使用 InheritedWidget,包括其基础概念、工作原理及代码实现。虽然 InheritedWidget 较底层,但它是许多高级状态管理解决方案的基础。
165 2
Flutter&鸿蒙next中的按钮封装:自定义样式与交互
在Flutter应用开发中,按钮是用户界面的重要组成部分。Flutter提供了多种内置按钮组件,但有时这些样式无法满足特定设计需求。因此,封装一个自定义按钮组件变得尤为重要。自定义按钮组件可以确保应用中所有按钮的一致性、可维护性和可扩展性,同时提供更高的灵活性,支持自定义颜色、形状和点击事件。本文介绍了如何创建一个名为CustomButton的自定义按钮组件,并详细说明了其样式、形状、颜色和点击事件的处理方法。
185 1
|
9月前
|
flutter:第一个flutter&Widget的使用 (二)
本文介绍了Flutter框架下的基本组件及其用法,包括简单的 Stateless Widget 如文本和按钮,以及更复杂的 StatefulWidget 示例。详细解释了如何使用 `context` 获取祖先小部件的信息,并展示了 `MaterialApp` 的属性及用途。此外,还探讨了 `StatefulWidget` 与 `StatelessWidget` 的区别,以及 `AppBar` 的常见属性配置方法。适合Flutter初学者参考学习。
106 2
Flutter 的 Widget 概述与常用 Widgets 与鸿蒙 Next 的对比
Flutter 是 Google 开发的开源 UI 框架,用于快速构建高性能的移动、Web 和桌面应用。Flutter 通过 Widget 构建 UI,每个 UI 元素都是 Widget,包括文本、按钮、图片等。Widget 不仅描述外观,还描述行为,是不可变的。常见的 Widget 包括结构型(Container、Column、Row)、呈现型(Text、Image)、交互型(ElevatedButton)和状态管理型(StatefulWidget)。Flutter 与鸿蒙 Next 在组件化架构、开发语言、布局系统、性能和跨平台支持方面各有优势
206 0
Flutter-底部弹出框(Widget层级)
文章描述了如何在Flutter中使用DraggableScrollableSheet创建一个底部弹出框,同时保持其可手势滑动关闭。作者遇到问题并提出对原控件进行扩展,以支持头部和列表布局的滑动关闭功能。
291 0
flutter GestureDetector 点击空白区域无反应解决办法
flutter GestureDetector 点击空白区域无反应解决办法
220 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问