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

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.kler.cn/news/133700.html

相关文章:

  • java使用 TCP 的 Socket API 实现客户端服务器通信
  • NSSCTF第12页(3)
  • PS学习笔记——视图调整
  • em/px/rem/vh/vw 的区别?
  • Activiti,Apache camel,Netflex conductor对比,业务选型
  • Page分页records有数据,但是total=0,解决办法
  • 服务器数据恢复—VMware虚拟化下误操作导致服务器崩溃的数据恢复案例
  • 单片机FLASH下载算法的制作
  • vue-pdf在vue框架中的使用
  • 输出特殊图案,请在c环境中运行,看一看,Very Beautiful!
  • Vue 前置 后置 路由守卫 独享 路由权限控制 自定义属性
  • upload-labs(1-17关攻略详解)
  • Typora——优雅的排版也是一种品味
  • PHPhotoLibrary 获取相册权限注意事项
  • 「Verilog学习笔记」用3-8译码器实现全减器
  • 记录基于scapy构造ClientHello报文的尝试
  • 快速入门ESP32——开发环境配置PlatformIO IDE
  • Flutter NestedScrollView 、SliverAppBar全解析,悬浮菜单的应用
  • C#中的string和string builder有什么区别
  • docker 安装mongodb 实现 数据,日志,配置文件外挂
  • 关于我开始热爱生活,也会把该做的做好这件事
  • 【算法每日一练]-分块(保姆级教程 篇1)POJ3648
  • 百胜杯答题系统
  • 公网访问全能知识库工具AFFINE,Notion的免费开源替代
  • 【hive遇到的坑】—使用 is null / is not null 对string类型字段进行null值过滤无效
  • C++ 虚函数和多态性
  • React整理总结(三)
  • 公司内部网络架设悟空CRM客户管理系统 cpolar无需公网IP实现内网,映射端口外网访问
  • 【测开求职】面试题:HR面相关的开放性问题
  • 基于Prometheus快速搭建网络质量监控平台