Flutter 动画学习

Flutter学习之布局、交互、动画 /颜色//数量int count;//集合放动画@override//绘制流程//因为这个wiaget是80 球和球之间相隔5i < count;i++){//确定圆心 半径 画笔//第一个球 r//第二个球 5 + 3r//第三个球 15 + 5r//第四个球 30 + 7r//半径也是随着动画值改变//刷新是否重绘@override= this; 阅读详情

Flutter 动画(Animation)官方文档地址:https://api.flutter.dev/flutter/animation/animation-library.html

一、隐式(全自动)动画

在Flutter中,隐式动画(Implicit Animation)是一种自动播放的动画效果,只要Widget发生改变,就会自动播放一个过渡动画。大部分以Animated开头的Widget都是带有隐式动画效果的控件。

  • 只在自身属性产生变化时产生动画,当子控件属性发生变化时不会产生动画效果。

1. AnimatedContainer / AnimatedOpacity / AnimatedPadding

  • duration:定义动画持续的时间。duration:Duration(seconds/milliseconds: VALUE),VALUE不能为小数,只能为整数。
  • Curves:控制动画的播放效果。默认是线性(linear)

2. AnimatedSwitch

用于在不同的控件之间来回切换时填充动画效果。当AnimatedSwitch内部的子控件发生变化时,就会自动播放一个动画效果。

当在同一类控件之间切换时,不会产生动画效果。例如:两个内容不同的Text()来回切换,不会有动画效果。在这种情况下想要产生切换动画效果,需要添加关键字key:ValueKey("XXX")或者直接使用key:UniqueKey(),来标志其唯一性。

  • transitionBuilder:来控制切换的动画效果。

AnimatedCrossFaded是优化版本的AnimatedSwitch

3. 补间动画(TweenAnimationBuilder)

在duration中规定的时间段内,会根据tween自动生成补间数值不停的调用builder,同时将该补间数值传递给builder中的value,从而渲染出动画效果。

  • duration:动画持续的时间
  • tween:单词between的简拼,需要定义 begin 和 end 属性,即动画开始和结束的两个关键帧,Flutter自动补全中间的。
  • builder:需要return一个Widget,最终进行渲染。其中的value值会为tween中补间的数值。

其中tween中的begin只有在程序刚运行的时候,从begin运行到end,以后在改变数值,会从当前的数值运行到新定义的end,一开始定义的begin就不再使用。如果不传入begin,程序会自动将end的值赋值给begin。

 

二、显示控件

 

当我们需要创建无限循环的动画,而不是在两个值之间过渡的动画时,就需要使用显示控件来实现。大部分都是以Transaction结尾。例如RotationTransaction、SlideTransition、ScaleTransition。

1. RotationTransaction

需要定义一个Animated<double>来控制动画的运转。我们可以使用Flutter提供的AnimationController来实现。

  • turns:控制旋转的属性,需要一个Animated<double>类型的值。
//SingleTickerProviderStateMixin:获取屏幕刷新的数据,满足不同设备的刷新频率
class _MyHomePageState extends State<MyHomePage> with SingleTickerProviderStateMixin {


//定义AnimationController
  AnimationController _controller;

//在该State开始时,初始化AnimationController
  @override
  void initState() {
    super.initState();

    _controller = AnimationController(//填充数值
      duration: Duration(seconds: 1),//定义持续的时间
      lowerBound:0.0,//定义填充数字的下限,默认为0.0
      upperBound:1,//定义填充数值的上限,默认为1.0
      vsync: this,//使用了SingleTickerProviderStateMixin,这里直接将vsync赋值为this
    );
  }

//在State结束时,释放,防止内存泄漏
  @override
  void dispose() {
    // TODO: implement dispose
    super.dispose();
    _controller.dispose();
  }

...
      body: Center(
        child: RotationTransition( //显示动画控件
          turns: _controller,//使用controller进行控制
          child: Center(
            child: Container(
              width: 200.0,
              height: 200.0,
              color: Colors.blueAccent,
              child: Text(
                'Hello World',
                style: TextStyle(
                  fontSize: 50.0,
                  fontWeight: FontWeight.w800,
                ),
              ),
            ),
          ),
        ),
      ),
 floatingActionButton: FloatingActionButton(
        onPressed: (){
          _controller.forward();//转动一次
          //_controller.repeat();//不停的转动。0——>1;0——1
          //_controller.repeat(reverse:true); //从0——>1;1——>0
          //_controller.stop();//原地停止转动
          //_controller.reset();//重置
            
        },
...

   }
}


改变AnimationController的范围除了可以使用lowerBound和UpperBound以外,还可以在XXXTransaction(  )中使用controller的地方调用其drive方法。例如ScaleTransition:

  child: ScaleTransition(
          scale: _controller.drive(Tween(begin:0.5,end:2.0)),
        //scale: Tween(begin:0.5,end:2.0)//另一种写法,方便叠加tween
        //       .chain(CurveTween(curve:Curves.elasticInOut))//添加一个弹性效果
        //       .chain(CurveTween(curve:Interval(0.8,1)))//在0.8到1区间内运动完成动画,其它时间不动
        //       .animate(_controller),
          child: Center(
            child: Container(
              width: 200.0,
              height: 200.0,
              color: Colors.blueAccent,
              child: Text(
                'Hello World',
                style: TextStyle(
                  fontSize: 50.0,
                  fontWeight: FontWeight.w800,
                ),
              ),
            ),
          ),
        ),

2. 自定义控件

使用AnimatedBuilder控件绘制。

AnimatedBuilder(
    animation:_controller,//手动控制器
    builder:(BuildContext context, Widget child){
        return WIDGET(//child优化
              
        ),
    }
    child://此处的child为一个AnimatedBuilder的属性,将不需要更新的Widget放在这里,每次渲染时将跳过此部分内容
),
  • animation:Animated<double>
  • builder:每当animation发生变化时,builder就会每一帧重新绘制一次

可以通过AnimatedController来实现不是从0-1数值变化的动画,比如:将container的height从100——>300。

我们都知道,AnimationController中的控制器是一个在0——1之间变化的Animated<double>,对于Opacity这种在0——1之间变化的属性可以满足需求。但是对于像高度等变化范围并不局限于0——1之间的属性来说,就不能直接通过AnimationController来控制属性变化。我们可以通过Tween来确定一个区间,然后通过其evaluate函数来对AnimationController这个0-1之间的数值变换进行函数运算,从而可以得到一个不局限于0——1之间的区间。

 child: Container(
              width: 200.0,
              height: Tween(begin: 200.0,end: 500.0).evaluate(_controller),
              color: Colors.blueAccent,
              child: Text(
                'Hello World',
                style: TextStyle(
                  fontSize: 50.0,
                  fontWeight: FontWeight.w800,
                ),
              ),
            ),

还可以有一下写法来让代码看起来更加整洁

...
Widget build(BuildContext context) {

    final Animation heightAnimation = Tween(begin: 200.0,end: 300.0).animate(_controller);

    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: RotationTransition(
          turns: _controller,
          child: Center(
            child: Container(
              width: 200.0,
              height: heightAnimation.value,
              color: Colors.blueAccent,
              child: Text(
                'Hello World',
                style: TextStyle(
                  fontSize: 50.0,
                  fontWeight: FontWeight.w800,
                ),
              ),
            ),
          ),
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: (){
          _controller.stop();
        },
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ), // This trailing comma makes auto-formatting nicer for build methods.
    );
  }
...

三、主动画(Hero)

在两个界面之间跳转的过程中对某元素添加动画效果。

对需要添加过渡效果的部分都添加上Hero标签

  • tag:唯一的属性,只有需要过渡的两个部分具有相同的tag

 

四、CustomPainter

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Flutter学习之布局、交互、动画(2) /颜色//数量int count;//集合放动画我这里整理了一份完整的学习思维以及Android开发知识大全PDF。当然实践出真知,即使有了学习线路也要注重实践,学习过的内容只有结合实操才算是真正的掌握。《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!幕外动画(//译者语:动画的UI不在当前屏幕时)消耗不必要的资源。 阅读详情

相关推荐

Flutter学习之布局、交互、动画(1)

文章会持续更新的。绝对干货!!!Android进阶学习全套手册关于实战,我想每一个做开发的都有话要说,对于小白而言,缺乏实战经验是通病,那么除了在实际工作过程当中,我们如何去更了解实战方面的内容呢?实际上,我们很有必要去看一些实战相关的电子书。

2401_84412104的博客 917

33、Flutter之动画切换组件(AnimatedSwitcher)

实际开发中,我们经常会遇到切换UI元素的场景,比如Tab切换、路由切换。为了增强用户体验,通常在切换时都会指定一个动画,以使切换过程显得平滑。Flutter SDK组件库中已经提供了一些常用的切换组件,如PageView、TabView等,但是,这些组件并不能覆盖全部的需求场景,为此,Flutter SDK中提供了一个AnimatedSwitcher组件,它定义了一种通用的UI切换抽象。 AnimatedSwitcher AnimatedSwitcher 可以同时对其新、旧子元素添加显示、隐藏动画。也就

wywinstonwy的专栏 6890

VS Code配置MinGW64编译非线性优化库NLopt

VS Code用MinGW64编译C++代码安装MSYS2软件并配置非线性优化库NLopt和测试引用库代码的完整具体步骤。:若使用非UCRT版本(如传统MinGW64),替换所有路径中的。库文件会自动安装到MSYS2的。

weixin_30777913的博客 901

【Flutter学习笔记】9.6 动画切换组件(AnimatedSwitcher)

`AnimatedSwitcher` 可以同时对其新、旧子元素添加显示、隐藏动画,在需要切换新旧元素的场景广泛使用。也就是说在`AnimatedSwitcher`的**子元素**发生变化时,会对其旧元素和新元素做动画。这里的子元素“发生变化”指的就是child widget的类型或者key发生了改变,则旧的child会执行隐藏动画,而新的child会执行显示动画。

cherreggy的博客 1921

ESP32-S3驱动雨滴传感器实战:从原理到ADC/GPIO双模式数据采集

本文详细介绍了ESP32-S3驱动雨滴传感器的实战教程,涵盖其工作原理及ADC/GPIO双模式数据采集方法。通过解析传感器利用水的导电性检测雨量的核心机制,提供了完整的硬件连接方案与软件驱动代码,包括模拟量(AO)的ADC读取和数字量(DO)的GPIO读取,并附有调试技巧,帮助开发者快速实现雨滴检测功能。

weixin_32005771的博客 154

virtuoso--DFF

27-实验课-std_cell2

qq_61440044的博客 2004

Flutter 动画体系

Flutter动画体系 基础概念 Flutter中也对动画进行了抽象,主要涉及Animation、Curve、Controller、Tween这四个角色,它们一起配合来完成一个完整动画 Animation 它主要的功能是保存动画的插值和状态,根据Animation对象的控制方式,动画可以正向运行(从起始状态开始,到终止状态结束),也可以反向运行,甚至可以在中间切换方向 Curve Flutter中通过Curve(曲线)来描述动画过程,我们把匀速动画称为线性的(Curves.linea

木寸~ 347

计算机网络实验——入侵检测系统实验

在图1所示的网络结构中,此方案的具体实施:在路由器Router1的接口1出方向配置入侵检测策略,在收到ICMP ECHO请求包时,丢弃并同步向日志服务器报告警告,此时,终端PC2和PC3无法对终端PC0和PC1执行ping操作,并且日志服务器将记录相应的警告信息;在实验一的基础上,添加扩展分组过滤器,指定需要进行检测的信息流的类别,将扩展分组和对应的入侵检测规则进行绑定,使得只对特定的信息流进行入侵检测。加载指定类别的特征库,这里的指定类别是 ios_ips 类别中的 basic 子类别。

放放的博客 1563

flutter使用AnimatedBuilder动画不播放

解决方案:将AnimatedBuilder包裹在如Center的布局约束中 关键代码: class GrowTransition extends StatelessWidget { GrowTransition({required this.child, required this.animation}); late final Widget child; late final Animation<double> animation; @override Widge

yingkongshi07的博客 781

芒果YOLOv8改进72:动态标签分配策略篇之ATSS:自适应训练样本选择Adaptive Training Sample Selection策略

YOLOv8代码实践|ATSS标签分配策略改进🥭

包括YOLOv5、YOLOv7、YOLOv8等模型改进 2907

JavaFX Stage

JavaFXStagejavafx.stage.Stage表示 JavaFX 桌面应用程序中的窗口。在 JavaFX 内部,Stage您可以插入一个 JavaFX Scene,它表示在窗口内显示的内容 - 在Stage.当 JavaFX 应用程序启动时,它会创建一个根Stage对象,该对象将传递给 start(Stage primaryStage)JavaFX 应用程序的根类的方法。此Stage 对象代表 JavaFX 应用程序的主窗口。

2012年开始工作,全栈开发老兵,目前已是一个老师,分享这么多年的心得体会 507

Flutter 组件 | Builder 构造器与 BuildContext 认知

主题列表:juejin, github, smartblue, cyanosis, channing-cyan, fancy, hydrogen, condensed-night-purple, greenwillow, v-green, vue-pro, healer-readable, mk-cute, jzman, geek-black, awesome-green 贡献主题:http...

张风捷特烈的博客 263

RK3568平台开发系列讲解(DMA篇)DMA engine使用

DMA传输属于异步传输,在启动传输之前,slave driver需要将此次传输的一些信息(例如src/dst的buffer、传输的方向等)提交给dma engine(本质上是dma controller driver),dma engine确认okay后,返回一个描述符(由struct dma_async_tx_descriptor抽象)。DMA_PREP_PQ_DISABLE_P、DMA_PREP_PQ_DISABLE_Q、DMA_PREP_CONTINUE,PQ有关的操作,TODO。

内核笔记 1722

Flutter组合动画学习

如何使用动画控制器和动画来创建一个简单的动画效果。具体来说,它通过一个 `AnimationController` 来控制两个动画,一个用于旋转,一个用于绘制。

且听真言 1564

基于YOLOv10的机器人抓取引导系统:从物体检测到精准抓取

python# 数据标注工具简化版import os"""启动标注工具""""""标注单张图像"""print(f"标注图像: {os.path.basename(img_path)}")print("请在图像上绘制抓取矩形框...")# 这里应该实现交互式标注界面# 简化版本直接返回示例标注# 示例标注数据"""保存标注结果"""# 保存为YOLO格式# 转换为YOLO格式。

YOLO 377

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Flutter学习笔记 动画

Animation(动画): AnimationController _animationController; @override void initState() { // TODO: implement initState super.initState(); _animationController = AnimationController( ...

weixin_42215775的博客 279

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Flutter动画学习之实践

在上一篇文章中了解了Animation、Curve、Controller、Tween在Flutter中动画中最主要的四个角色。本篇文章就开始实践。

yuantian_shenhai的博客 308

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Flutter学习指南:交互、手势和动画

Flutter学习指南: 4.UI布局和控件 3.熟悉Dart语言 2.编写第一个应用 1.开发环境搭建 本文是第5篇,建议大家收藏起来慢慢阅读,也欢迎分享给更多人。在这一篇文章中,我们首先介绍手势事件的处理和页面跳转的基础知识,然后通过实现一个 echo 客户端的前端页面来加强学习;最后我们再学习内置的动画 Widget 以及如何自定义动画效果。 手势处理 按钮点击 为了获取按钮...

大灰狼的小绵羊哥哥的博客 456

Flutter动画学习二

如何在 Flutter 中使用自定义动画和剪裁(clipping)实现一个简单的动画效果。

且听真言 1515

flutter学习-动画

flutter实现动画1. 动画API认识1.1 Animation 对于一个前端App来说,添加适当的动画,可以给用户更好的体验和视觉效果。所以无论是原生的IOS或是Android,还是前端开发中都会提供默写动画的API Flutter有自己的渲染闭环,我们当然可以给它提供一丁的数据模型,来让他们帮助我们实现对应的动画效果 1. 动画API认识 动画其实是我们通过某些方式(比如对象、Animation对象)给Flutter引擎提供不同的值,而Flutter可以根据我们提供的值,给对应的Widget添加顺滑

yong_19930826的博客 931

Flutter学习总结(二十、Flutter的动画)

Flutter的动画 一起从0开始学习Flutter! 为了让我们的场景切换更加流畅和一些元素更能抓住用户的眼球,我们在APP中都会添加多种动画来装扮我们的APP,在以往的开发中对于普通的旋转位移,缩放动画我们都有一些简单的处理方式,但是面对复杂的动画我们都会耗费我们大量的时间来进行计算,我们一起来针对Flutter中的动画进行学习,看下在Flutter中我们如何处理我们日常使用的动画。 在Flutter中也为我们提供了多种动画示例,我们稍后看下,我们先看下如何不使用这些动画示例来创建一个我们想要的动画。

Flutter学习总结 553

Flutter动画学习之简介

在动画开始执行后开始生成动画帧,屏幕每刷新一次就是一个动画帧,在动画的每一帧,会随着根据动画的曲线来生成当前的动画值(Animation.value),然后根据当前的动画值去构建UI,当所有动画帧依次触发时,动画值会依次改变,所以构建的UI也会依次变化,所以最终我们可以看到一个完成的动画。其中一个比较常用的Animation类是Animation。Flutter中的动画系统是基于Animation对象的,widget可以在build函数中读取Animation对象的当前值, 并且可以监听动画的状态改变。

yuantian_shenhai的博客 190

【Flutter学习】动画基础介绍

本篇将介绍Flutter中动画。首先来看下Flutter的动画基础概念和相关类,Animation:Flutter中动画的核心类,AnimationController:动画管理类,Tween:补间对象,用于计算动画使用的数据范围之间的插值。,Listeners和StatusListeners:用于监听动画状态改变,CurvedAnimation:用于定义非线性曲线动画.....

Ho博客 7389

flutter学习--动画

对于android来说,动画分为属性、帧、补间动画三大类,巧妙的使用动画,能够极大的提升用户的体验。对于flutter来说,作为强大的UI开发工具,也提供了动画的基本实现。 一、动画常用的类 Animation : flutter动画库中的核心类,继承Listenable。插入用于指导与动画的值。提供了动画执行的监听方法,用于实时更新界面。 AnimationController : 管理An...

qinbin2015的博客 394
上一篇: List、Set、Map及遍历方法(Dart语言)
下一篇: 一. 继承和构造函数(Kotlin)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值