Flutter笔记:拖拽手势

Flutter笔记
拖拽手势

作者李俊才 (jcLee95):https://blog.csdn.net/qq_28550263
邮箱 :291148484@163.com
本文地址:https://blog.csdn.net/qq_28550263/article/details/134485123



1. 概述

在构建交互式应用程序时,处理用户的手势输入是至关重要的一部分。Flutter 提供了一套丰富的手势识别系统,使得开发者可以轻松地实现各种手势操作,如点击、双击、拖拽、缩放等。

在 Flutter 中,GestureDetector 组件可以识别和处理各种手势,包括拖拽手势。GestureDetector 提供了一系列的回调函数,这些函数在不同的手势事件发生时被调用,例如当手势开始、更新或结束时。对于拖拽手势,GestureDetector 提供了专门的回调函数来处理垂直拖拽、水平拖拽和二维拖拽。本文接下来的小节将对这些拖拽分别举例讲解。

2. 垂直拖拽

GestureDetector 中处理垂直拖拽手势的属性如表所示:

属性描述
onVerticalDragDown当用户接触屏幕并准备在垂直方向移动时触发
onVerticalDragStart当用户接触屏幕并开始在垂直方向移动时触发
onVerticalDragUpdate当用户手指在垂直方向移动时触发
onVerticalDragEnd当用户手指在垂直方向移动后、用户手指抬起时触发

例如:

import 'package:flutter/material.dart';void main() {runApp(const MyApp());
}class MyApp extends StatelessWidget {const MyApp({Key? key}) : super(key: key);Widget build(BuildContext context) {return MaterialApp(home: Scaffold(appBar: AppBar(title: const Text('垂直拖拽示例'),),body: const Center(child: DragBox(),),),);}
}class DragBox extends StatefulWidget {const DragBox({Key? key}) : super(key: key);State<DragBox> createState() => _DragBoxState();
}class _DragBoxState extends State<DragBox> {// _offsetY 是一个状态变量,用于存储垂直偏移量double _offsetY = 0.0;Widget build(BuildContext context) {return GestureDetector(// 当用户在垂直方向上拖拽时,更新 _offsetY 的值onVerticalDragUpdate: (DragUpdateDetails details) {setState(() {_offsetY += details.delta.dy;});},// 使用 Transform.translate 来改变 Container 的位置child: Transform.translate(offset: Offset(0, _offsetY),child: Container(color: Colors.blue,width: 100.0,height: 100.0,),),);}
}

拖拽效果如下:
在这里插入图片描述

3. 水平拖拽

GestureDetector 中处理水平拖拽手势的属性如表所示:

属性描述
onHorizontalDragDown当用户接触屏幕并准备在水平方向移动时触发
onHorizontalDragStart当用户接触屏幕并开始在水平方向移动时触发
onHorizontalDragUpdate当用户手指在水平方向移动时触发
onHorizontalDragEnd当用户手指在水平方向移动后、用户手指抬起时触发

例如:

import 'package:flutter/material.dart';void main() {runApp(const MyApp());
}class MyApp extends StatelessWidget {const MyApp({Key? key}) : super(key: key);Widget build(BuildContext context) {return MaterialApp(home: Scaffold(appBar: AppBar(title: const Text('水平拖拽示例'),),body: const Center(child: DragBox(),),),);}
}class DragBox extends StatefulWidget {const DragBox({Key? key}) : super(key: key);State<DragBox> createState() => _DragBoxState();
}class _DragBoxState extends State<DragBox> {// _offsetY 是一个状态变量,用于存储垂水平移量double _offsetX = 0.0;Widget build(BuildContext context) {return GestureDetector(// 当用户在屏幕上拖拽时,更新 _offsetX 的值onHorizontalDragUpdate: (DragUpdateDetails details) {setState(() {_offsetX += details.delta.dx;});},// 使用 Transform.translate 来改变 Container 的位置child: Transform.translate(offset: Offset(_offsetX, 0),child: Container(color: Colors.red,width: 100.0,height: 100.0,),),);}
}

拖拽效果如下:

在这里插入图片描述

4. 二维拖拽

GestureDetector 中处理二维拖拽手势的属性如表所示:

属性描述
onPanDown当用户接触屏幕并准备移动时触发
onPanStart当用户接触屏幕并开始移动时触发
onPanUpdate当用户手指移动时触发
onPanEnd当用户手指移动后、用户手指抬起时触发

例如:

import 'package:flutter/material.dart';void main() {runApp(const MyApp());
}class MyApp extends StatelessWidget {const MyApp({Key? key}) : super(key: key);Widget build(BuildContext context) {return MaterialApp(home: Scaffold(appBar: AppBar(title: const Text('二维拖拽示例'),),body: const Center(child: DragBox(),),),);}
}class DragBox extends StatefulWidget {const DragBox({Key? key}) : super(key: key);State<DragBox> createState() => _DragBoxState();
}class _DragBoxState extends State<DragBox> {// _offsetX 和 _offsetY 是状态变量,用于存储水平和垂直偏移量double _offsetX = 0.0;double _offsetY = 0.0;Widget build(BuildContext context) {return GestureDetector(// 当用户在屏幕上拖拽时,更新 _offsetX 和 _offsetY 的值onPanUpdate: (DragUpdateDetails details) {setState(() {_offsetX += details.delta.dx;_offsetY += details.delta.dy;});},// 使用 Transform.translate 来改变 Container 的位置child: Transform.translate(offset: Offset(_offsetX, _offsetY),child: Container(color: Colors.green,width: 100.0,height: 100.0,),),);}
}

拖拽效果如下:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/148770.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Adobe Illustrator——原创设计的宝藏软件

今天&#xff0c;我们来谈谈一款在Adobe系列中曾经多次给大家都提到的原创性极强的设计理念丰富的矢量图形编辑软件——Adobe Illustrator。 Adobe Illustrator&#xff0c;其定位是一款与Photoshop相类似对矢量图形进行编辑的软件。 Adobe Illustrator&#xff0c;作为全球最著…

【自然语言处理】【大模型】赋予大模型使用工具的能力:Toolformer与ART

赋予大模型使用工具的能力&#xff1a;Toolformer与ART ​ 本文介绍两种赋予大模型使用外部工具能力的方法&#xff1a;Toolformer和ART。 Toolformer论文地址&#xff1a;https://arxiv.org/pdf/2302.04761.pdf ART论文地址&#xff1a;https://arxiv.org/pdf/2303.09014.pd…

学习网络编程No.10【深入学习HTTPS】

引言&#xff1a; 北京时间&#xff1a;2023/11/14/18:45&#xff0c;因为种种原因&#xff0c;上个月的文章昨天才更新&#xff0c;目前处于刷题前夕&#xff0c;算法课在看了。这次和以前不一样&#xff0c;因为以前对知识框架没有很好的理念&#xff0c;并不清楚相关知识要…

三天吃透Redis面试八股文

目录&#xff1a; Redis是什么&#xff1f;Redis优缺点&#xff1f;Redis为什么这么快&#xff1f;讲讲Redis的线程模型&#xff1f;Redis应用场景有哪些&#xff1f;Memcached和Redis的区别&#xff1f;为什么要用 Redis 而不用 map/guava 做缓存?Redis 数据类型有哪些&…

环境配置|GitHub——解决Github无法显示图片以及README无法显示图片

一、问题背景 最近在整理之前写过的实验、项目&#xff0c;打算把这些东西写成blog&#xff0c;并把工程文件整理上传到Github上。但在上传README文件的时候&#xff0c;发现github无法显示README中的图片&#xff0c;如下图所示&#xff1a; 在README中该图片路径为&#xff1…

Flutter笔记:缩放手势

Flutter笔记 缩放手势 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/details/134485138 目 录 1. 概述2. 缩放手…

FlinkCDC数据实时同步Mysql到ES

考大家一个问题&#xff0c;如果想要把数据库的数据同步到别的地方,比如es,mongodb,大家会采用哪些方案呢&#xff1f; ::: 定时扫描同步&#xff1f; 实时日志同步? 定时同步是一个很好的方案&#xff0c;比较简单&#xff0c;但是如果对实时要求比较高的话&#xff0c;定…

【开源】基于Vue.js的智能教学资源库系统

项目编号&#xff1a; S 050 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S050&#xff0c;文末获取源码。} 项目编号&#xff1a;S050&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 课程档案模块2.3 课…

quinn源码解析:QUIC数据包是如何发送的

quinn源码解析&#xff1a;QUIC数据包是如何发送的 简介QUIC协议中的概念endpoint&#xff08;端点&#xff09;connection&#xff08;连接&#xff09;Stream&#xff08;流&#xff09;Frame (帧) 发包过程解析SendStream::write_allConnectionDriverEndpointDriver 简介 q…

R语言和RStudio的下载安装(非常简便舒适)

目录 R语言和RStudio的关系R语言和Tableau下载R语言进入官网选择清华镜像源Download R for Windows选择base版本开始下载进行安装配置环境变量检查是否安装成功 下载RStudio进入官网点击下载进行安装检查是否安装成功打开选择R语言环境成功打开显示四个工作区 R语言和RStudio的…

【预处理详解】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 1. 预定义符号 2. #define定义常量 3. #define定义宏 4. 带有副作用的宏参数 5. 宏替换的规则 6. 宏函数的对比 7. #和## 7.1 #运算符 7.2 ## 运算符 8. 命名约定 …

你知道什么是SaaS吗?

你知道什么是SaaS吗&#xff1f; 云服务架构的三个概念 PaaS 英文就是 Platform-as-a-Service&#xff08;平台即服务&#xff09;PaaS&#xff0c;某些时候也叫做中间件。就是把客户采用提供的开发语言和工具&#xff08;例如Java&#xff0c;python, .Net等&#xff09;开…

计算两个向量的叉积numpy.cross()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 计算两个向量的叉积 numpy.cross() [太阳]选择题 请问代码中最后输出正确的是&#xff1f; import numpy as np a np.array([1, 2, 3]) b np.array([4, 5, 6]) c np.cross(a, b) pri…

nrm的安装以及使用

1&#xff0c;什么是nrm nrm 是一个 npm 源管理器&#xff0c;允许你快速地在 npm源间切换。 什么意思呢&#xff0c;npm默认情况下是使用npm官方源&#xff08;使用npm config ls命令可以查看&#xff09;&#xff0c;在国内用这个源肯定是不靠谱的&#xff0c;一般我们都会…

云原生专栏丨基于服务网格的企业级灰度发布技术

灰度发布&#xff08;又名金丝雀发布&#xff09;是指在黑与白之间&#xff0c;能够平滑过渡的一种发布方式。在其上可以进行A/B testing&#xff0c;即让一部分用户继续用产品特性A&#xff0c;一部分用户开始用产品特性B&#xff0c;如果用户对B没有什么反对意见&#xff0c;…

ssm+vue的高校疫情防控管理系统(有报告)。Javaee项目,ssm vue前后端分离项目。

演示视频&#xff1a; ssmvue的高校疫情防控管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;ssm vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结…

项目自动化构建工具——make/Makefile

目录 一、概念 二、使用实例 三、原理 四、进度条程序 1、缓冲区问题 1、概念 2、\r和\n 2、代码编写 一、概念 一个工程中的源文件不计数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;makefile定义了一系列的规则来指定&#xff0c;哪些文件需要先…

Open AI开发者大会:AI“科技春晚”

ChatGPT的亮相即将满一年之时&#xff0c;OpenAI举行了自己的首次开发者大会。OpenAI首席执行官Sam Altman宣布推出最新的大模型GPT-4 Turbo。正如“Turbo”一词的中文含义“涡轮增压器”一样&#xff0c;本次发布会上&#xff0c;OpenAI的这款最新大模型在长文本、知识库、多模…

Django+Vue项目创建 跑通

参考链接&#xff1a; 【精选】DjangoVue项目构建_django vue-CSDN博客 一、背景 主要介绍如何使用后端Django 前端Vue 的技术栈快速地搭建起一套web项目的框架。 为什么使用Django和Vue? Django是Python体系下最成熟的web框架之一&#xff0c;由于Python语言的易用…

【心得】PHP的文件上传个人笔记

目录 1 php的文件上传绕过 黑名单绕过 2 php文件上传的00截断 3 iconv字符转换异常后造成了字符截断 4 文件后缀是白名单的时候的绕过 web服务器的解析漏洞绕过 5.高级文件上传绕过 1 .htaccess nginx.htaccess 2 服务端内容检测 3 配合伪协议来绕过 4.配合日志包含绕…