Flutter - 手势(Gestures)

Flutter - 手势(Gestures) 首页 / Flutter入门教程 / Flutter - 手势(Gestures)

手势是Flutter中一个有趣的函数,它使无涯教程能够与移动应用程序(或任何基于触摸的设备)进行交互。通常,手势定义了用户对移动设备进行特定控制的任何物理动作或运动。手势的一些示例是:

  • 锁定手机屏幕后,您可以在屏幕上滑动手指以将其解锁。
  • 在移动屏幕上点击按钮。
  • 在基于触摸的设备上点击并按住应用程序图标,以将其拖到屏幕上。

无涯教程在日常生活中会使用所有这些手势来与您的手机或基于触摸的设备进行交互。

    指针

    指针是代表有关用户交互的原始数据的第一层。它具有事件,这些事件描述了指针在屏幕上的位置和移动,例如触摸(touches),鼠标(mice)和样式(style)。 Flutter不提供任何取消或停止指针事件进一步分派的机制。 Flutter提供了一个侦听器窗口小部件,以直接从窗口小部件层监听指针事件。指针事件主要分为以下四种类型:

    • PointerDownEvents     -  它允许指针在特定位置接触屏幕。
    • PointerMoveEvents      -  它允许指针从屏幕上的一个位置移动到另一位置。
    • PointerUpEvents           -  它允许指针停止接触屏幕。
    • PointerCancelEvents    -  取消指针交互时发送此事件。

    手势

    它是第二层,表示从多个单独的指针事件中识别出的语义动作,例如轻击(tap),拖动(drag)和缩放(scale)。它还能够分派与手势生命周期相对应的多个事件,例如拖动开始(drag start),拖动更新(drag update)和拖动结束(drag end)。下面列出了一些常用的手势:

    Tap    -  这意味着在短时间内从指尖触摸屏幕表面,然后松开。此手势包含以下事件:

    • onTapDown
    • onTapUp
    • onTap
    • onTapCancel

    Double Tap   -  它类似于“轻拍”手势,但您需要在短时间内轻按两次。此手势包含以下事件:

    • ondoubletap

    Drag                -  它使无涯教程可以用指尖触摸屏幕表面,然后将其从一个位置移动到另一位置,然后释放它们。 Flutter将拖动分为两种类型:

    1. Horizontal Drag: 此手势使指针可以在水平方向上移动。它包含以下事件:
      • onHorizontalDragStart
      • onHorizontalDragUpdate
      • onHorizontalDragEnd
    2. Vertical Drag: 此手势允许指针在垂直方向上移动。它包含以下事件:
      • onVerticalDragStart
      • onVerticalDragUpdate
      • onVerticalDragEnd

    Long Press    -   这意味着长时间在特定位置触摸屏幕表面。此手势包含以下事件:

    • onLongPress

    Pan                  -   这意味着要用指尖触摸屏幕表面,指尖可以在不松开指尖的情况下向任何方向移动。此手势包含以下事件:

    • onPanStart
    • onPanUpdate
    • onPanEnd

    Pinch               -   这意味着使用两根手指放大或缩小屏幕,以捏住(移动手指和拇指或将它们放在触摸屏上)。

    手势监测器

    Flutter提供了一个小部件,该小部件通过使用GestureDetector小部件为所有类型的手势提供了出色的支持。 GestureWidget是非可视的小部件,主要用于检测用户的手势。手势检测器的基本思想是一个无状态小部件,该小部件的构造函数中包含用于不同触摸事件的参数。

    让无涯教程学习如何通过简单的onTap()事件在应用程序中使用这些手势,并确定GestureDetector如何处理此手势。在这里,无涯教程将创建一个框式小部件,根据所需的规范对其进行设计,然后向其添加onTap()函数。

    现在,创建一个新的Flutter项目,并在 main.dart 文件中替换以下代码。

    import 'package:flutter/material.dart';
    
    void main() => runApp(MyApp());
    
    class MyApp extends StatelessWidget {
     //这个小部件是您的应用程序的根Root。
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Flutter Demo Application', theme: ThemeData(
          primarySwatch: Colors.green,),
          home: MyHomePage(),
        );
      }
    }
    class MyHomePage extends StatefulWidget {
      @override
      MyHomePageState createState() => new MyHomePageState();
    }
    
    class MyHomePageState extends State {
      @override
      Widget build(BuildContext context) {
        return new Scaffold(
          appBar: new AppBar(
            title: new Text('Gestures Example'),
            centerTitle: true,
          ),
          body: new Center(child: GestureDetector(
              onTap: () {
                print('Box Clicked');
              },
              child: Container(
                height: 60.0,
                width: 120.0,
                padding: EdgeInsets.all(10.0),
                decoration: BoxDecoration(
                  color: Colors.blueGrey,
                  borderRadius: BorderRadius.circular(15.0),
                ),
                child: Center(child: Text('Click Me')),
              )
          )),
        );
      }
    }

    在Android Studio中运行此Dart文件时,它将在仿真器中提供以下输出。

    Flutter 姿态

    在上图中,您可以在屏幕中心看到带有圆角边缘的按钮。当您点击它时,它的行为就像一个按钮,并且可以在控制台中看到输出。

    Flutter还提供了一组小部件,可让您执行特定手势以及高级手势。这些小部件如下所示:

    Dismissible                     -   支持轻拂手势以关闭小工具。

    Draggable                        -   支持拖动手势来移动小部件。

    LongPressDraggable   -   支持拖动手势以将小部件及其父小部件一起移动。

    DragTarget                      -   可以接受任何可拖动(Draggable)的小部件

    IgnorePointer                -   可从手势检测过程中隐藏小部件及其子部件。

    AbsorbPointer               -   可停止手势检测过程本身。因此,任何重叠的窗口小部件都无法参与手势检测过程,因此不会引发任何事件。

    Scrollable                        -   支持滚动小部件内部可用的内容。

    多手势示例

    在本节中,无涯教程将看到在Flutter应用程序中多个手势是如何工作的。该演示应用程序由父级和子级两个集合组成。在这里,所有操作都通过使用'RawGestureDetector'和自定义的'GestureRecognizer'进行手动处理。自定义GestureRecognizer为手势列表提供'AllowMultipleGestureRecognizer'属性,并创建一个'GestureRecognizerFactoryWithHandlers'。接下来调用onTap()事件将文本输出到控制台。

    打开flutter项目,并在main.dart文件中替换以下代码,

    import 'package:flutter/gestures.dart';
    import 'package:flutter/material.dart';
    
    //它是您的 Flutter 应用程序的入口点。
    void main() {
      runApp(
        MaterialApp(
          title: 'Multiple Gestures Demo',
          home: Scaffold(
            appBar: AppBar(
              title: Text('Multiple Gestures Demo'),
            ),
            body: DemoApp(),
          ),
        ),
      );
    }
    
    class DemoApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return RawGestureDetector(
          gestures: {
            AllowMultipleGestureRecognizer: GestureRecognizerFactoryWithHandlers(
                  () => AllowMultipleGestureRecognizer(),
                  (AllowMultipleGestureRecognizer instance) {
                instance.onTap = () => print('It is the parent container gesture');
              },
            )
          },
          behavior: HitTestBehavior.opaque,
          //父容器
          child: Container(
            color: Colors.green,
            child: Center(
              //现在,将第二个容器包装在 RawGestureDetector
              child: RawGestureDetector(
                gestures: {
                  AllowMultipleGestureRecognizer:
                  GestureRecognizerFactoryWithHandlers(
                        () => AllowMultipleGestureRecognizer(),  //constructor
                        (AllowMultipleGestureRecognizer instance) {  //initializer
                      instance.onTap = () => print('It is the nested container');
                    },
                  )
                },
                //在第一个中创建嵌套容器。
                child: Container(
                  color: Colors.deepOrange,
                  width: 250.0,
                  height: 350.0,
                ),
              ),
            ),
          ),
        );
      }
    }
    
    class AllowMultipleGestureRecognizer extends TapGestureRecognizer {
      @override
      void rejectGesture(int pointer) {
        acceptGesture(pointer);
      }
    }

    运行应用程序时,它将提供以下输出。

    链接:https://www.learnfk.comhttps://www.learnfk.com/flutter/flutter-gestures.html

    来源:LearnFk无涯教程网

    Flutter 姿态

    接下来,点击橙色框,在控制台上显示以下输出。

    It is the nested container.
    It is the parent container gesture.
    

    祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)

    技术教程推荐

    如何设计一个秒杀系统 -〔许令波〕

    容器实战高手课 -〔李程远〕

    小马哥讲Spring AOP编程思想 -〔小马哥〕

    etcd实战课 -〔唐聪〕

    零基础实战机器学习 -〔黄佳〕

    全链路压测实战30讲 -〔高楼〕

    超级访谈:对话毕玄 -〔毕玄〕

    超级访谈:对话玉伯 -〔玉伯〕

    AI大模型系统实战 -〔Tyler〕

    好记忆不如烂笔头。留下您的足迹吧 :)