Flutter实现手势识别功能详解方法

目录
  • GestureDetector
  • 点击事件
  • 双击事件
  • 长按事件
  • 水平/垂直拖动事件
  • 缩放事件
  • InkWell
  • Ink
  • Listener
  • 案例

GestureDetector

GestureDetector 是手势识别的组件,可以识别点击、双击、长按事件、拖动、缩放等手势

点击事件

点击相关事件包括:

  • onTapDown:按下时回调。
  • onTapUp:抬起时回调。
  • onTap:点击事件回调。
  • onTapCancel:点击取消事件回调。

按下然后抬起调用顺序

onTapDown-> onTapUp-> onTap

按下后移动调用顺序

onTapDown-> onTapCancel

示例

class _YcHomeBodyState extends State<YcHomeBody> {
  String desc = '';
  Color containerColor = Colors.red;
  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      child: Column(
        children: [
          Container(
            width: 420,
            height: 330,
            color: containerColor,
          ),
          const SizedBox(
            width: 100,
            height: 20,
          ),
          Text("点击事件:$desc")
        ],
      ),
      onTapDown: (TapDownDetails tapDownDetails) {
        setState(() {
          desc += '按下,';
          containerColor = Colors.blue;
        });
      },
      onTapUp: (TapUpDetails tapUpDetails) {
        setState(() {
          desc += '抬起,';
          containerColor = Colors.red;
        });
      },
      onTap: () {
        setState(() {
          desc += '点击,';
          containerColor = Colors.yellow;
        });
      },
      onTapCancel: () {
        setState(() {
          desc += '取消,';
          containerColor = Colors.pink;
        });
      },
    );
  }
}

双击事件

双击是快速且连续2次在同一个位置点击,双击监听使用onDoubleTap方法

return GestureDetector(
  child: Column(
    children: [
      Container(
        width: 420,
        height: 330,
        color: containerColor,
      ),
      const SizedBox(
        width: 100,
        height: 20,
      ),
      Text("点击事件:$desc")
    ],
  ),
  onDoubleTap: () {
    setState(() {
      desc = '双击了';
    });
  },

长按事件

长按事件(LongPress)包含长按开始、移动、抬起、结束事件,说明如下:

  • onLongPressStart:长按开始事件回调。
  • onLongPressMoveUpdate:长按移动事件回调。
  • onLongPressUp:长按抬起事件回调。
  • onLongPressEnd:长按结束事件回调。
  • onLongPress:长按事件回调。

示例

return GestureDetector(
  child: Column(
    children: [
      Container(
        width: 420,
        height: 330,
        color: containerColor,
      ),
      const SizedBox(
        width: 100,
        height: 20,
      ),
      Text("点击事件:$desc")
    ],
  ),
  onLongPressStart: (v) {
    setState(() {
      desc += '长按开始,';
      print("长按开始:$v");
    });
  },
  onLongPressMoveUpdate: (v) {
    setState(() {
      desc += '长按移动,';
      print("长按移动:$v");
    });
  },
  onLongPressUp: () {
    setState(() {
      desc += '长按抬起,';
      print("长按抬起");
    });
  },
  onLongPressEnd: (v) {
    setState(() {
      desc += '长按结束,';
      print("长按结束:$v");
    });
  },
  onLongPress: () {
    setState(() {
      desc += '长按回调,';
      print("长按回调");
    });
  });

执行顺序

1、长按开始->回调->结束->抬起
2、长按开始->回调->移动->结束->抬起

水平/垂直拖动事件

垂直/水平拖动事件包括按下、开始、移动更新、结束、取消事件,以垂直为例说明如下:

  • onVerticalDragDown:垂直拖动按下事件回调
  • onVerticalDragStart:垂直拖动开始事件回调
  • onVerticalDragUpdate:指针移动更新事件回调
  • onVerticalDragEnd:垂直拖动结束事件回调
  • onVerticalDragCancel:垂直拖动取消事件回调
GestureDetector(
  onVerticalDragStart: (v) => print('onVerticalDragStart'),
  onVerticalDragDown: (v) => print('onVerticalDragDown'),
  onVerticalDragUpdate: (v) => print('onVerticalDragUpdate'),
  onVerticalDragCancel: () => print('onVerticalDragCancel'),
  onVerticalDragEnd: (v) => print('onVerticalDragEnd'),
  child: Center(
    child: Container(
      width: 200,
      height: 200,
      color: Colors.red,
    ),
  ),
)

缩放事件

缩放(Scale)包含缩放开始、更新、结束。说明如下:

  • onScaleStart:缩放开始事件回调。
  • onScaleUpdate:缩放更新事件回调。
  • onScaleEnd:缩放结束事件回调。
GestureDetector(
  onScaleStart: (v) => print('onScaleStart'),
  onScaleUpdate: (ScaleUpdateDetails v) => print('onScaleUpdate'),
  onScaleEnd: (v) => print('onScaleEnd'),
  child: Center(
    child: Container(
      width: 200,
      height: 200,
      color: Colors.red,
    ),
  ),
)

InkWell

InkWell 组件在用户点击时出现“水波纹”效果。事件和属性挺多的,就看一下常用的

设置水波纹颜色

点击和长按都能够触发水波纹,点击波纹效果快,长按波纹效果慢

 return  InkWell(
      onTap: (){
        print("点击了");
      },
      splashColor: Colors.red,
      child: const Text('点击InkWell,水波纹'),
    );

给字体添加边距和圆角边框,扩大“水波纹”效果:

Center(
      child: InkWell(
          onTap: () {
            print("点击了");
          },
          splashColor: Colors.red,
          child: Container(
              padding: const EdgeInsets.all(10),
              decoration: BoxDecoration(
                  border: Border.all(color: Colors.red),
                  borderRadius: const BorderRadius.all(Radius.circular(20))),
              child: const Text('点击InkWell,水波纹'))),
    );

可以看到水波纹会超出圆角,为了解决这个问题可以使用Ink

Ink

Ink控件用于在[Material]控件上绘制图像和其他装饰,以便[InkWell]、[InkResponse]控件的“水波纹”效果在其上面显示。

  return Center(
        child: Ink(
      decoration: const BoxDecoration(
          gradient: LinearGradient(
              begin: Alignment.topLeft,
              end: Alignment.bottomRight,
              colors: [Color(0xFFDE2F21), Color(0xFFEC592F)]),
          borderRadius: BorderRadius.all(Radius.circular(20))),
      child: InkWell(
        borderRadius: const BorderRadius.all(Radius.circular(20)),
        child: Container(
          padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 20),
          child: const Text(
            '这是InkWell的点击效果',
            style: TextStyle(color: Colors.white),
          ),
        ),
        onTap: () {},
      ),
    ));
  }

总感觉有点复杂,InkWell 会导致水纹超出边框,就需要外面再套一层组件,然后还要写个渐变,不知道咋形容。

Listener

Listener 是一个监听指针事件的控件,比如按下、移动、释放、取消等指针事件,但Listener无法监听鼠标特有的事件,比如:移入、悬停、移出事件。鼠标事件使用MouseRegion监听。

通常情况下,监听手势事件使用GestureDetector,GestureDetector是更高级的手势事件。

Listener的事件介绍如下:

  • onPointerDown:按下时回调
  • onPointerMove:移动时回调
  • onPointerUp:抬起时回调
Listener(
  onPointerDown: (PointerDownEvent pointerDownEvent) {
    print('$pointerDownEvent');
  },
  onPointerMove: (PointerMoveEvent pointerMoveEvent) {
    print('$pointerMoveEvent');
  },
  onPointerUp: (PointerUpEvent upEvent) {
    print('$upEvent');
  },
  child: Container(
    height: 200,
    width: 200,
    color: Colors.blue,
    alignment: Alignment.center,
  ),
)

常用属性说明如下:

position:相对屏幕的坐标的偏移。

localPosition:相对当前控件的偏移。

pressure:按压力度。

delta:2次指针移动事件的偏移。

orientation:指针移动方向

案例

进度按钮

// 使用枚举定义按钮的状态
enum ButtonStates { none, loading, done }
class YcHomeBody extends StatefulWidget {
  const YcHomeBody({Key? key}) : super(key: key);
  @override
  State<YcHomeBody> createState() => _YcHomeBodyState();
}
class _YcHomeBodyState extends State<YcHomeBody> {
  //定义按钮的状态
  ButtonStates _buttonStates = ButtonStates.none;
  @override
  Widget build(BuildContext context) {
    return Center(
      child: MaterialButton(
        color: Colors.blue,
        textColor: Colors.white,
        minWidth: 200,
        height: 40,
        //通过自定义方法,根据情况返回相应的组件
        child: _build(),
        onPressed: () {
          //点击按钮后将按钮状态变为加载中
          setState(() {
            _buttonStates = ButtonStates.loading;
            //延迟2s后将状态变为完成
            Future.delayed(const Duration(seconds: 2), () {
              setState(() {
                _buttonStates = ButtonStates.done;
              });
            });
          });
        },
      ),
    );
  }
  //自定义方法
  _build() {
    if (_buttonStates == ButtonStates.none) {
      //无状态
      return const Text("登录");
    } else if (_buttonStates == ButtonStates.loading) {
      //进度条组件
      return const CircularProgressIndicator(
        backgroundColor: Colors.white,
        strokeWidth: 2,
      );
    } else if (_buttonStates == ButtonStates.done) {
      return const Icon(
        Icons.check,
        color: Colors.white,
      );
    }
  }
}

代码看着很长但是逻辑很简单,定义了一个枚举类型的按钮类型。一开始类型为无状态,此时显示登录;当点击按钮后,状态变为加载中,显示圆形进度条组件;2s后将按钮状态变为加载完成,现成完成的图标

到此这篇关于Flutter实现手势识别功能详解方法的文章就介绍到这了,更多相关Flutter手势识别内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Flutter手势密码的实现示例(附demo)

    目录 前言 开始 绘制圆点 绘制手势路径 组合9个圆点盘和手势路径 手势密码组件的使用 上传自定义组件到pub仓库 后记 前言 本篇记录的是使用Flutter完成手势密码的功能,大致效果如下图所示: 该手势密码的功能比较简单,下面会详细记录实现的过程,另外还会简单说明如何将该手势密码作为插件发布到pub仓库. 开始 实现上面的手势密码并不难,大致可以拆分成如下几部分来完成: 绘制9个圆点 绘制手指滑动的线路 合并以上两个部分 绘制圆点 我们使用面向对象的方式来处理9个圆点的绘制,每个圆点作为一个

  • flutter消息推送客户端集成方案详解

    目录 一.背景 二.第三方消息推送——个推 1.简介 2.注册开通 3.自定义消息推送——透传 三.项目集成 1.个推客户端flutter插件 2.Android和IOS配置 1)Android 2) iOS 3.通知栏插件flutter_local_notifications 4.个推消息与通知栏整合 最后 一.背景 公司一个CRM APP项目是用Flutter写的,根据业务要求,需要集成消息推送功能.所谓的消息推送就是系统会根据某些行为自动推送信息,手机的通知栏会接收到信息,点击可以打开ap

  • Flutter框架解决盒约束widget和assets里加载资产技术

    目录 盒约束 文本输入widget assets 加载资产 盒约束 flutter: assets: - assets/my_icon.png - assets/background.png 在Flutter中,小部件由其底层RenderBox对象渲染.渲染框受其父对象的约束,并在这些约束下调整自身大小.约束包括最小宽度.最大宽度和高度:尺寸由特定的宽度和高度组成. 通常,根据小部件如何处理其约束,有三种类型的框: 尽可能大.例如,“Center”和“ListView”的渲染框 遵循子部件的大小

  • Flutter项目手势运用及单独指针消歧问题解决方案

    目录 对于手势的运用 单独指针 消歧 依赖包中的字体 对于手势的运用 指针表示用户与设备屏幕交互的原始数据.有四种类型的指针事件 PointerDownEvent指针触摸屏幕上的特定位置 PointerMoveEvent指针从屏幕上的一个位置移动到另一个位置 PointerUpEvent指针停止触摸屏幕 PointerCancelEvent指针的输入事件不再针对此应用程序(事件取消) Widget build(BuildContext context) { return new GestureD

  • Flutter图片缓存管理ImageCache原理分析

    目录 引言 PaintingBinding 减少图片缓存 增大阀值 思考 引言 设计: 嗯? 这个图片点击跳转进详情再返回图片怎么变白闪一下呢?产品: 是啊是啊! 一定是个bug开发: 囧囧囧 在开发过程中, 也许你也遇到过这样一个场景. 进入一个页面后,前一个页面的图片都会闪白一下. 或者在列表中,加载很多列表项后,之前列表中的图片都需要重新加载.你有没有想过这一切的原因是什么呢? 没错! 它就是我们今天介绍的主人公 --- ImageCache 可能有些人对ImageCache还有些陌生,

  • Flutter RendererBinding作用源码分析

    目录 分析 PipelineOwner flushLayout flushCompositingBits flushPaint flushSemantics initRenderView scheduleInitialLayout scheduleInitialPaint 分析 RendererBinding 的作用是负责render tree 和flutter engine之间的连接. 我们在启动App的时候,首先会创建 PiplineOwner ,然后通过platformDispatcher

  • 基于Flutter实现手势密码加密与解锁功能

    目录 前言 1.绘制静态图形 2.存储手势密码数据 3.添加手势交互 4.绘制.刷新密码线 5.加入密码错误动画 总结 前言 密码的由来:在公元前405年,由古希腊和斯巴达的战争中,由于斯巴达盟友波斯帝国背叛,导致古希腊和斯巴达两败俱伤,这时斯巴达抓了一个波斯国的信使,这个信使 没有任何情报,只有一条有着杂乱无章的希腊字母的普通腰带,最终斯巴达统帅破解了这条腰带,成功击败了希腊.这就是世界上最早的密码.同时也是世界上最早的解密. 密码在我们生活中无处不在,作为个人隐私的最后一道防线显得无比的重要

  • Flutter实现手势识别功能详解方法

    目录 GestureDetector 点击事件 双击事件 长按事件 水平/垂直拖动事件 缩放事件 InkWell Ink Listener 案例 GestureDetector GestureDetector 是手势识别的组件,可以识别点击.双击.长按事件.拖动.缩放等手势 点击事件 点击相关事件包括: onTapDown:按下时回调. onTapUp:抬起时回调. onTap:点击事件回调. onTapCancel:点击取消事件回调. 按下然后抬起调用顺序 onTapDown-> onTapU

  • Android6.0 屏幕固定功能详解

    可能大家看到这个标题不知道是什么东西,我先说明下,android6.0在设置->安全->屏幕固定开启后,然后再长按home键出现最近的几个Activity可以选择一个图钉按钮就开启了屏幕固定功能. 屏幕固定开启后,屏幕只能固定在设定的Task上的Activity切换. 一.设置固定屏幕 我们先来看SystemUI/src/com/android/systemui/recents/ScreenPinningRequest.java的代码,这段代码就是长按home键出现几个Activity,然后按

  • django实现用户登陆功能详解

    简介: Python下有许多款不同的 Web 框架.Django是重量级选手中最有代表性的一位.许多成功的网站和APP都基于Django. Django是一个开放源代码的Web应用框架,由Python写成. Django遵守BSD版权,初次发布于2005年7月, 并于2008年9月发布了第一个正式版本1.0 . Django采用了MVC的软件设计模式,即模型M,视图V和控制器C. 用户名密码登陆实现: 在apps.users下找到views.py文件: 以下代码重写了authenticate()

  • 使用C++扩展Python的功能详解

    本文主要研究的是使用C++扩展Python的功能的相关问题,具体如下. 环境 VS2005Python2.5.4Windows7(32位) 简介 长话短说,这里说的扩展Python功能与直接用其它语言写一个动态链接库,然后让Python来调用有点不一样(虽然本质是一样的).而是指使用Python本身提供的API,使用C++来对Python进行功能性扩展,可以这样理解,使用更高效的语言实现一些算法计算等等需要更高执行效率的核心(或者需要与系统进行密切交互的)模块,然后让Python像调用内建标准库

  • python使用paramiko实现ssh的功能详解

    个人认为python的paramiko模块是运维人员必学模块之一,其ssh登录功能是旅行居家必备工具. 安装paramiko很简单,pip install paramiko就搞定了,其依赖库会被一并安装. paramiko的官方站点在这里:http://www.paramiko.org/.有需要深入研究的可以阅读官方文档. paramiko模块提供了ssh及sft进行远程登录服务器执行命令和上传下载文件的功能. 一.基于用户名和密码的 sshclient 方式登录 # 建立一个sshclient

  • 2021年的Python 时间轴和即将推出的功能详解

    我们目前生活在Python 3.8的稳定时代,上周发布了Python的最新稳定版本3.8.4. Python 3.9已经处于其开发的beta阶段,并且2020年7月3日预发布了beta版本(3.9.0b4),第五版beta预定于明天发布. 3.9的第一个稳定版本预计将在2020年10月发布.Python3.10的开发也将于2020年5月开始,并且第一个beta版本预计在2021年5月开始. 对于Python爱好者来说,显然,有趣的时代即将到来. 浏览三个版本(3.8.3.9和3.10)的发布时间

  • C++头文件algorithm中的函数功能详解

    目录 1. 不修改内容的序列操作 (1)all_of (2)any_of (3)none_of (6)find_if (7)find_if_not (8)find_end (10)adjacent_find (12)count_if (15)is_permutation (16)search 2. 修改内容的序列操作 (1)copy (2)copy_n (3)copy_if (4)copy_backward (5)move (6)move_backward (7)swap (8)swap_ran

  • Java 自定义Spring框架与核心功能详解

    目录 Spring核心功能结构 核心容器 spring-beans和spring-core模块 spring-context模块 spring-context-support模块 spring-context-indexer模块 spring-expression模块 AOP和设备支持 数据访问与集成 Web组件 通信报文 集成测试 bean概述 在上一讲中,我们对Spring的基本使用进行了一个简单的回顾,接下来,我们就来看一下Spring核心功能结构. Spring核心功能结构 Spring

  • Python 工具类实现大文件断点续传功能详解

    依赖 os.sys.requests 工具代码 废话不多说,上代码. #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Created on Sat Oct 23 13:54:39 2021 @author: huyi """ import os import sys import requests def download(url, file_path): # 重试计数 count = 0 #

  • 用Android实现京东秒杀功能详解

    首先看效果图: 京东秒杀是两个小时一个场次,我们获取到场次后,通过场次+两个小时后,获取到最终的时间,拿最终时间的时间戳,与当前时间时间戳相减,求得剩余的小时,分钟,秒数,即可实现倒计时功能! 具体代码实现如下: 1.布局页面activity_seckill.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.andr

随机推荐