Flutter的手势识别功能实现GestureDetector

news/2024/10/21 3:46:35/

GestureDetector简介

GestureDetector 是 Flutter 中一个非常常用的小部件,它提供了许多手势识别的功能,包括点击、双击、长按、拖动、缩放等等。

使用方法

GestureDetector 可以包裹其他部件,当用户在这些部件上进行手势操作时,GestureDetector 会捕捉这些手势操作并触发相应的回调函数。

常用的回调函数

GestureDetector 的构造函数接受一个 GestureDetector.onTap 的回调函数作为参数,这个回调函数会在用户点击该部件时被触发。除了 onTap 外,GestureDetector 还有很多其他的回调函数,包括:

  • onDoubleTap:双击回调函数。
  • onLongPress:长按回调函数。
  • onPanStartonPanUpdateonPanEnd:拖动回调函数。
  • onScaleStartonScaleUpdateonScaleEnd:缩放回调函数。

除了这些回调函数之外,GestureDetector 还有其他属性,比如:

  • behavior:用于控制手势处理的行为,可以是 HitTestBehavior.deferToChild(默认值,将手势传递给子部件),HitTestBehavior.opaque(将手势作为不透明的处理,不会传递给子部件)或HitTestBehavior.translucent(将手势作为透明的处理,会传递给子部件)。
  • excludeFromSemantics:用于控制该部件是否应该在语义树中排除掉。
  • dragStartBehavior:用于控制拖动开始的行为,可以是 DragStartBehavior.start(默认值,拖动开始时立即触发),DragStartBehavior.down(仅在手指按下并移动一定距离后触发)或 DragStartBehavior.deferred(仅在手指停止移动后触发)。

举例说明

下面是一个示例代码,演示如何使用 GestureDetector 来捕捉用户的手势操作:

import 'package:flutter/material.dart';class TestPage extends StatelessWidget {Widget build(BuildContext context) {return Scaffold(body: GestureDetector(onTap: () {print('onTap');},onDoubleTap: () {print('onDoubleTap');},onLongPress: () {print('onLongPress');},onPanStart: (DragStartDetails details) {print('onPanStart: $details');},onPanUpdate: (DragUpdateDetails details) {print('onPanUpdate: $details');},onPanEnd: (DragEndDetails details) {print('onPanEnd: $details');},child: Container(width: 200,height: 200,color: Colors.blue,child: Center(child: Text('GestureDetector'),),),),);}
}

效果图如下:
image.png
打印如下:
image.png
在这个示例中,我们创建了一个 GestureDetector,并为其设置了多个回调函数,分别对应不同的手势操作。在 child 属性中,我们使用一个 Container 来展示这个 GestureDetector,当用户在这个 Container 上进行手势操作时,GestureDetector 会捕捉这些操作并触发相应的回调函数。

需要注意的是,GestureDetector 仅能捕捉与其子部件重叠的手势操作。如果需要在整个屏幕上捕捉手势操作,可以使用 GestureDetector 的祖先部件 GestureDetectorRawGestureDetector

缩放的例子

import 'package:flutter/material.dart';class TestPage extends StatelessWidget {Widget build(BuildContext context) {double scaleFactor = 1.0;Offset offset = Offset(0, 0);return Scaffold(body: GestureDetector(onTap: () {print('onTap');},onDoubleTap: () {print('onDoubleTap');},onLongPress: () {print('onLongPress');},onScaleStart: (ScaleStartDetails details) {print('用户开始缩放');},onScaleUpdate: (ScaleUpdateDetails details) {print('用户缩放中...当前缩放比例:${details.scale}');scaleFactor *= details.scale;},onScaleEnd: (ScaleEndDetails details) {print('用户结束缩放');},child: Transform.scale(scale: scaleFactor,child: Transform.translate(offset: offset,child: Container(width: 200,height: 200,color: Colors.red,),),),),);}
}

http://www.ppmy.cn/news/106503.html

相关文章

一文搞懂激活函数(Sigmoid/ReLU/LeakyReLU/PReLU/ELU)

深度学习算法之前的机器学习算法,并不需要对训练数据作概率统计上的假设;但为了让深度学习算法有更好的性能,需要满足的关键要素之一,就是:网络的输入数据服从特定的分布: 数据分布应该是零均值化的&#…

巧计口诀-软件测试的生命周期,黑盒测试设计方法

又到了找工作的日子,背诵这些基本知识和概念又开始了。我找到一个好办法背诵这些方法: 软件测试的生命周期是“分级设编执评” ,这样理解啊:“有个公司啊,要施行分级设计编制,就要执行评估了,大…

好用的自动化框架-Allure

概述 报告主要包含总览、类别、测试套件、图表、时间刻度、功能、包等7大部分,支持自定义诸多信息,包括附件添加、缺陷链接、案例链接、测试步骤、Epic、Feature、Story、Title、案例级别等,相当强大。 allure与pytest的结合使用可以呈现完…

golang 协程的实现原理

核心概念 要理解协程的实现, 首先需要了解go中的三个非常重要的概念, 它们分别是G, M和P, 没有看过golang源代码的可能会对它们感到陌生, 这三项是协程最主要的组成部分, 它们在golang的源代码中无处不在. G (goroutine) G是goroutine的头文字, goroutine可以解释为受管理的…

优化版本 穿越火线(CF) FPS AI 自瞄 代码 权重 数据集(下面有链接)

更新初衷 本人在制作过程中,有一些爱钻研的朋友来问以及提出增加一些新的功能点回会更好,本着学习研究态度,在第一个版本上进行优化,增加一些内容 不喜欢看过程的小伙伴直接看最下面 界面 解决问题: 1、进入慢 2、无…

知识变现海哥:知识付费小程序的10大坑

知识付费小程序十个坑你不要掉进去, D一,小程序付费内容要全 电子书、PPT、音频、视频都要包含,现在很多付费内容只包含视频,这种小程序不能购买的。 D二,付费内容有试学功能 只有通过试用、试学给用户建立信任&…

密码学知识

密码学是网络安全、信息安全、区块链等产品的基础,常见的非对称加密、对称加密、散列函数等,都属于密码学范畴。 明文:加密前的消息叫明文(plain text) 密文:加密后的文本叫密文(cipher text) 密钥:只有掌…

ubuntu安装yarn

参考https://phoenixnap.com/kb/how-to-install-yarn-ubuntu Follow the steps below to install Yarn using Corepack: Ensure your Node.js version is up-to-date. node -v Corepack requires Node.js 16.10 or later. If the output shows an older version, update Node.…