首页 > 其他分享 >flutter系列之:使用AnimationController来控制动画效果

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

时间:2023-05-20 10:02:27浏览次数:49  
标签:动画 效果 AnimationController 我们 child flutter Alignment

目录

  • 简介
  • 构建一个要动画的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();
      },

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

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

总结

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

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



标签:动画,效果,AnimationController,我们,child,flutter,Alignment
From: https://blog.51cto.com/flydean/6317182

相关文章

  • Stable Diffusion又出大招!「文生动画」震撼发布淘汰导演,DC英雄一秒变身
    前言 StabilityAI又来卷了AI视觉圈了!StableAnimation震撼发布,动画效果令人惊叹。本文转载自新智元仅用于学术分享,若侵权请联系删除欢迎关注公众号CV技术指南,专注于计算机视觉的技术总结、最新技术跟踪、经典论文解读、CV招聘信息。CV各大方向专栏与各个部署框架最全教程整......
  • JQuery动画
    12、JQuery动画12.1、基本动画show()将隐藏的元素显示hide()将可见的元素隐藏toggle()可见就隐藏,不可见就显示以上动画都可以添加参数 1、第一个参数是动画执行时长,以毫秒为单位 2、第二个参数是动画的回调函数(动画完成后自动调用的函数)12.2、淡入淡出动画fadeln()......
  • 如何通过显示动画实现书籍翻页动效(OpenHarmony)
    如何通过显示动画实现书籍翻页动效场景介绍翻页动效是应用开发中常见的动效场景,常见的如书籍翻页、日历翻页等。本文就为大家举例讲解如何通过ArkUI提供的显示动画接口animateTo实现书籍翻页的效果。效果呈现本例最终实现效果如下:环境要求IDE:DevEcoStudio3.1Beta1SDK:Oh......
  • flutter系列之:使用AnimationController来控制动画效果
    目录简介构建一个要动画的widget让图像动起来总结简介之前我们提到了flutter提供了比较简单好用的AnimatedContainer和SlideTransition来进行一些简单的动画效果,但是要完全实现自定义的复杂的动画效果,还是要使用AnimationController。今天我们来尝试使用AnimationController来......
  • Flutter 3.1亮点功能介绍,加持移动应用高效开发
    2023年的GoogleI/O大会上,简直能用“亮瞎了眼”来形容:非常多的技术大版本更新,尤其是AI领域技术融合到了办公协同软件中来,以进一步提高蓝领、白领的工作效率,为企业降本增效。Flutter3.10版本的变化1、Dart3众所周知,Flutter是建立在Dart语言基础上的,本次大会上,Dart发布了一......
  • Android Lottie动画库的导入与使用
    没想到又把安卓捡回来了,好长时间没碰这玩意但是大作业又不得不写......emmmm所以为了给大作业里的功能实现一个好看的UI界面还是得写个app出来。不少app在启动时或者干别的什么活动时会有一个动画效果,这时候可以用Lottie库实现。添加依赖在build.gradle(:app)的dependencies添......
  • android开发mac系统搭建flutter开发环境
    安装xcodemac系统自带的AppStore里搜索xcode安装即可安装JDKJDK下载地址:https://www.oracle.com/java/technologies/downloads/需要登录Oracle账号才能下载下载dmg文件之后双击安装即可安装AndroidStudio开发工具AndroidStudio下载地址:https://developer.android.goog......
  • FreeCodeCamp-通过构建摩天轮学习 CSS 动画
    index.html<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>FerrisWheel</title><linkrel="stylesheet"href="./styles.css"></head&g......
  • Flutter开发中所有类说明 (知识来源于ChatGPT)-- 3
    名称:ParentDataElement功能描述:'ParentDataElement'是Flutter中的一个类,用于管理一个子部件在父部件中的布局位置和大小。通过'ParentDataElement'类,可以控制子部件在父部件中的位置、大小、层次以及其他布局属性。这个类通常与'ParentDataWidget'和'RenderObjectWidget'搭配使用......
  • Flutter开发中所有类说明 (知识来源于ChatGPT)-- 5
    名称:positionDependentBox功能描述:'positionDependentBox'是Flutter中的一个Widget,可以用于在屏幕中显示一个弹出式组件。它的特点是可以自动根据相对于屏幕的位置来调整组件的位置,比如用户点击一个按钮,组件会出现在按钮的下方。我们可以使用它来创建一些用户交互元素,比如菜单......