当前位置: 首页 > news >正文

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.lryc.cn/news/238181.html

相关文章:

  • 软件运维面试题
  • 代码随想录算法训练营第23期day53|1143.最长公共子序列、1035.不相交的线、53. 最大子序和
  • MySQL 的执行原理(五)
  • 如何快速将txt类型的日志文件转换为excel表格并进行数据分析报表统计图(如:饼图、折线图、柱状图)?
  • 内网穿透的应用-如何在Docker中部署MinIO服务并结合内网穿透实现公网访问本地管理界面
  • 关于Unity自带的保存简单且持久化数据PlayerPrefs类的使用
  • 力扣贪心——跳跃游戏I和II
  • 【SA8295P 源码分析 (三)】132 - GMSL2 协议分析 之 GPIO/SPI/I2C/UART 等通迅控制协议带宽消耗计算
  • 毕业论文GPT说:
  • Week-T10 数据增强
  • 史上最全!PMP实用应试技巧汇总!
  • 037、目标检测-SSD实现
  • 【开题报告】基于SpringBoot的摄影作品展示网站的设计与实现
  • SVR和SVM是什么关系
  • Flutter 3.16 中带来的更新
  • 批量插入数据与分页的原理及推导
  • SMART PLC累计流量功能块(梯形积分法+浮点数累加精度控制)
  • 【金融分析】Python:病人预约安排政策 | 金融模拟分析
  • 后端接口测试,令牌校验住,获取tocken 接口的方式
  • Ghidra逆向工具配置 MacOS 的启动台显示(Python)
  • 关于交换芯片调试 tx_delay rx_delay 的一点经验
  • 【图像分类】【深度学习】【轻量级网络】【Pytorch版本】MobileNets_V2模型算法详解
  • Spring Cloud 简介
  • Redis从入门到精通(二)- 入门篇
  • SpringDoc基础配置和集成OAuth2登录认证教程
  • 链路聚合-静态和动态区别
  • 发币成功,记录一下~
  • 一个完备的手游地形实现方案
  • vite vue3配置axios
  • 使用 C 语言快速排序将字符串按照 ASCII 码升序排列