flutter系列之:使用AnimationController来控制动画效果

news2024/11/14 15:36:25

文章目录

  • 简介
  • 构建一个要动画的widget
  • 让图像动起来
  • 总结

简介

之前我们提到了flutter提供了比较简单好用的AnimatedContainer和SlideTransition来进行一些简单的动画效果,但是要完全实现自定义的复杂的动画效果,还是要使用AnimationController。

今天我们来尝试使用AnimationController来实现一个拖拽图片,然后返回原点的动画。

构建一个要动画的widget

在本文的例子中,我们希望能够让一个图片可以实现拖拽然后自动返回原来位置的效果。

为了实现这个功能,我们首先构建一个放在界面中间的图片。

      child: Align(
        alignment: Alignment.center,
        child: Card(
          child: Image(image: AssetImage('images/head.jpg'))
        ),
      )

这里使用了Align组件,将一个图片对象放在界面中间。

接下来我们希望这个widget可以拖拽,那么把这个child放到一个GestureDetector中,这样就可以相应拖拽对应的响应。

 Widget build(BuildContext context) {
    final size = MediaQuery.of(context).size;
    return GestureDetector(

      onPanUpdate: (details) {
        setState(() {
          _animateAlign += Alignment(
            details.delta.dx / (size.width / 2),
            details.delta.dy / (size.height / 2),
          );
        });
      },

      child: Align(
        alignment: _animateAlign,
        child: Card(
          child: widget.child,
        ),
      ),
    );
  }

为了能实现拖动的效果,我们需要在GestureDetector的onPanUpdate方法中对Align的位置进行修改,所以我们需要调用setState方法。

在setState方法中,我们根据手势的位置来调整Alignment的位置,所以这里需要用到MediaQuery来获取屏幕的大小。

但是现在实现的效果是图像随手势移动而移动,我们还需要实现在手放开之后,图像自动回复到原来位置的动画效果。

让图像动起来

因为这次需要变动的是Alignment,所以我们先定义一个包含Alignment的Animation属性:

  late Animation<Alignment> _animation;

接下来我们需要定义一个AnimationController,用来控制动画信息,并且指定我们需要的动画起点和终点:

  late AnimationController _controller;

      _animation = _controller.drive(
      AlignmentTween(
        begin: _animateAlign,
        end: Alignment.center,
      ),
    );

我们动画的起点位置就是当前image所在的Alignment,终点就在Alignment.center。

Alignment有一个专门表示位置信息的类叫做AlignmentTween,如上代码所示。

有了起点和终点, 我们还需要指定从起点移动到终点的方式,这里模拟使用弹簧效果,所以使用SpringSimulation。

SpringSimulation需要提供对spring的描述,起点距离,结束距离和初始速度。

    const spring = SpringDescription(
      mass: 30,
      stiffness: 1,
      damping: 1,
    );

    final simulation = SpringSimulation(spring, 0, 1, -1);

我们使用上面创建的simulation,来实现动画:

    _controller.animateWith(simulation);

最后我们需要在手势结束的时候来执行这个动画即可:

      onPanEnd: (details) {
        _runAnimation();
      },

最后,运行效果如下所示:

总结

AnimationController是一个很强大的组件,但是使用起来也不是那么的复杂, 我们只需要定义好起点和终点,然后指定动画效果即可。

本文的例子:https://github.com/ddean2009/learn-flutter.git

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

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

相关文章

H桥电机驱动芯片CS9029C可pin对pin兼容DRV8841

CS9029C为打印机和其它电机一体化应用提供一种双通道集成电机驱动方案。CS9029C有两路H桥驱动&#xff0c;最大输出2.5A&#xff0c;可驱动两路刷式直流电机&#xff0c;或者一路双极步进电机&#xff0c;或者螺线管或者其它感性负载。双极步进电机可以以整步、2细分、4细分运行…

未来源码|Dart 3正式发布:100%健全的空值安全、迄今为止最大版本

推荐语&#xff1a; 自从 Flutter Forword 发布了 Dart 3α 预览 之后&#xff0c;大家对 Dart 3 的正式发布就一直翘首以待&#xff0c;这不仅仅是 Dart 版本号追上了 Flutter 版本号&#xff0c;更是 Dart 在 2.0 之后迎来的最大一次更新。Dart 3将只支持健全的Null安全&am…

微信小程序等待wx.requestPayment的回调函数执行完后再执行后续代码

async/await & Promise的再认识 背景 在开发微信小程序过程中&#xff0c;遇到如下需求&#xff1a; 需要等待wx.requestPayment的回调函数执行完后再执行后续代码 这是因为在调用wx.requestPayment之后&#xff0c;会弹出一个支付弹窗&#xff0c;如果此时点击右上角的…

从ChatGPT到大模型

AIGC AIGC1. 关于ChatGPT2. 关于大模型模型即服务。现在大模型的两种&#xff1a;大模型发展趋势&#xff1a;大模型作用&#xff1a;大模型核心&#xff1a; 3. 要复现一个ChatGPT需要的资源支持&#xff1f;4. ChatGPT的局限性5. 类ChatGPT 未来的发展ChatGPT 体现的通用性&…

Java从高德地图获取全国地铁站数据

Java从高德地图获取全国地铁站数据。 数据来源&#xff08;高德地图&#xff09;&#xff1a;http://map.amap.com/subway/index.html?&4401 采集代码 /*** 从高德地图地铁线路同步全国地铁站数据&#xff08;非必要不调用&#xff09;* 数据来源&#xff1a;http://ma…

【电厂用 JL-8D/3X2定时限电流继电器 复合继电器 功耗低 JOSEF约瑟】

JL-8D/3X2定时限电流继电器名称;定时限电流继电器型号:JL-8D/3X2触点容量250V5A功率消耗&#xff1c;5W返回系数0.90.97整定范围0.039.9A;0.130A辅助电源24220VDC/AC 系列型号&#xff1a; JL-8D/3X1定时限电流继电器&#xff1b; JL-8D/3X111A2定时限电流继电器&#xff1b…

深度操作系统 deepin V23 Beta 发布

深度操作系统 deepin V23 发布了首个 Beta 版本。 公告写道&#xff0c;它是 V23 Alpha 版本的一次升级&#xff0c;但不建议用于生产环境。作为一个专注于用户体验的系统&#xff0c;Deepin v23 beta 版本引入了许多新的特性&#xff0c;包括 DDE 新变化、终端、跨版本升级以…

Agilent安捷伦33522B任意波形发生器

Agilent安捷伦33522B任意波形发生器30兆赫 2通道 为您最苛刻的测量生成全方位信号的无与伦比的能力 具有 5 倍低谐波失真的正弦波&#xff0c;可提供更纯净的信号 脉冲频率高达 30 MHz&#xff0c;抖动减少 10 倍&#xff0c;可实现更精确的计时 具有排序功能的逐点任意波形功能…

Notepad++ 添加自定义右键菜单项

目录 1. 背景 020.添加右键菜单项 - “打开至” 030.添加右键菜单项 - “复制到剪切板” 效果图&#xff1a; 1. 背景 笔记本上使用Notepad&#xff0c;会因为存在标签栏&#xff0c;导致窗口能显示的行数减少。 去除标签栏后&#xff0c;又无法操作一些右键菜单。 转而开…

掌握企业核心:工商详细信息API 60多项全维度信息解读

引言 在当今竞争激烈的商业环境中&#xff0c;了解和评估企业的工商注册信息变得至关重要。无论是与供应商合作、寻找合作伙伴&#xff0c;还是进行市场调研和背景调查&#xff0c;我们都需要准确和全面的企业工商信息来做出明智的决策。但是&#xff0c;获取这些信息往往是一…

SpringBoot的常见配置

SpringBoot基础配置 1. 配置文件格式问题导入1.1 修改服务器端口1.2 自动提示功能消失解决方案1.3 SpringBoot配置文件加载顺序 2. yaml问题导入2.1 yaml语法规则2.2 yaml数组数据2.3 yaml数据读取 3. 多环境开发配置问题导入3.1 多环境启动配置3.2 多环境启动命令格式3.3 多环…

CloudCompare二次开发之如何通过PCL进行点云分割?

文章目录 0.引言1.CloudCompare界面设计配准(segment)按钮2.欧式聚类分割&#xff08;Euclidean_Seg&#xff09;3.基于区域生长的分割&#xff08;Region_Seg&#xff09; 0.引言 因笔者课题涉及点云处理&#xff0c;需要通过PCL进行点云数据一系列处理分析&#xff0c;查阅现…

【漏洞预警】泛微E-Cology ofsLogin任意用户登陆漏洞

泛微ofsLogin任意用户登陆漏洞 漏洞描述 泛微e-cology是一套兼具企业信息门户、知识文档管理、工作流程管理、人力资源管理、客户关系管理、项目管理、财务管理、资产管理、供应链管理、数据中心功能的企业大型协同管理平台。 泛微e-cology前台任意用户登录漏洞&#xff1a;…

Git 代码分支管理 | 京东云技术团队

作者&#xff1a;京东科技 周新智 一、引言 近日&#xff0c;IoT 研发团队加入了不少新同学&#xff0c;对 git 分支的命名和管理方式有些许的模糊&#xff0c;分支的命名规范以及管理方式对项目的版本发布至关重要&#xff0c;为了解决实际开发过程中版本发布时代码管理混乱…

大模型高效调参—PEFT库( Parameter-Efficient Fine-Tuning)

介绍 在面对特定的下游任务时&#xff0c;如果进行Full FineTuning&#xff08;即对预训练模型中的所有参数都进行微调&#xff09;&#xff0c;太过低效&#xff1b;而如果采用固定预训练模型的某些层&#xff0c;只微调接近下游任务的那几层参数&#xff0c;又难以达到较好的…

Java 8 腰斩!Java 17 暴涨 430%!!

前言 New Relic 最新发布了一份 “2023 年 Java 生态系统状况报告”&#xff0c;旨在提供有关当今 Java 生态系统状态的背景和见解。该报告基于从数百万个提供性能数据的应用程序中收集的数据&#xff0c;对生产中使用最多的版本、最受欢迎的 JDK 供应商、容器的兴起等多方面进…

数据链路层讲解

目录 一、数据链路层解决的问题 二、以太网协议 2.1 认识以太网 2.2 以太网帧格式 2.3 MAC地址 2.3.1 认识MAC地址 2.3.2 对比MAC地址和IP地址 2.4 MTU 2.4.1 认识MTU 2.4.2 MUT对IP协议的影响 2.4.3 MTU对UDP协议的影响 2.4.4 MTU对TCP协议的影响 2.5 数据跨网络…

什么是npu算力盒子,算力是越大越好吗?

一、什么是npu算力盒子&#xff1f;该怎么选&#xff1f; NPU&#xff08;神经处理单元&#xff09;算力盒子是一种专门用于进行人工智能计算的硬件设备&#xff0c;其中集成了高性能的NPU芯片。NPU是一种针对深度学习任务进行优化的处理器&#xff0c;具备高度并行计算和低功…

MySQL高级_第07章_InnoDB数据存储结构

MySQL高级_第07章_InnoDB数据存储结构 1.数据库的存储结构:页 索引结构给我们提供了高效的索引万式&#xff0c;不过索引信息以及数据记录都是保存在文件上的, 确切说是存储在页结构中。另一方面&#xff0c;索引是在存储引擎中实现的&#xff0c;MySQL服务器上的存储引擎负责…

文章生成器-原创文章生成器

在网络营销领域&#xff0c;优质文章是吸引新客户和保留老客户的重要工具。然而&#xff0c;生成高质量且符合SEO优化的文章并不是一件容易的事情。这就是为什么网站文章生成器如今备受欢迎的原因。而在众多的文章生成工具中&#xff0c;147GPT批量生成文章软件是一款非常出色的…