本节目标

[1] 认识动画器【曲线速率】的作用
[2] 绘制出Flutter内置的所有曲线效果常量
[3] 了解动画器的常用方法
[4] 了解动画器的状态,以及状态变化监听

一、动画速率曲线

动画曲线描述了动画运动过程中的速度变化曲率,比如开始运动很快,然后慢慢变慢。这样可以实现丰富的运动视觉效果。

动画曲线的核心是4个数字,他的本身是一个贝塞尔曲线。起止点固定。也就是说动画曲线在形式上速度表现就是两个控制点。FLUTTER中使用Curve类来表述。

1. 认识的使用

Curve是一个抽象类。它有很多实现子类。最通用的是Cubic。传入4个值。下面来看一下。如何使用CurveTeen来让动画的变化速率更加的具有曲线效果。

Curve --- 抽象类|--- FlippedCurve 翻转曲线|--- SawTooth 翻转曲线|--- Threshold 0~阈值 曲线

案例实现如下效果:红色小球在圈上运动。绿色小球向下运动。通过改变动画的速率曲线,查看效果。我们可以发现,通过添加曲线可以让运动在首尾慢,中间快。

代码实现

class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return MaterialApp(title: 'Flutter Demo',debugShowCheckedModeBanner: false,theme: ThemeData(primarySwatch: Colors.blue,),home: Scaffold(body: Center(child: CurveBox(curve: Cubic(1, -0.06, 0.1, 1.2),),),));}
}
class CurveBox extends StatefulWidget {final Color color;final Curve curve;CurveBox({Key? key, this.color = Colors.lightBlue, this.curve = Curves.linear}): super(key: key);@override_CurveBoxState createState() => _CurveBoxState();
}class _CurveBoxState extends State<CurveBox>with SingleTickerProviderStateMixin {late AnimationController _controller;late Animation<double> _angleAnimation;@overridevoid initState() {super.initState();_controller = AnimationController(duration: const Duration(seconds: 3),vsync: this,);_angleAnimation = CurveTween(curve: widget.curve).animate(_controller);_controller.repeat();}@overridevoid dispose() {_controller.dispose();super.dispose();}@overrideWidget build(BuildContext context) {return CustomPaint(size: Size(100, 100),painter: CurveBoxPainter(_controller, _angleAnimation), // 背景);}
}class CurveBoxPainter extends CustomPainter {final Animation<double> repaint; //Animation<double> angleAnimation;Paint _paint = Paint();CurveBoxPainter(this.repaint, this.angleAnimation) : super(repaint: repaint) {}@overridevoid paint(Canvas canvas, Size size) {canvas.clipRect(Offset.zero & size);canvas.translate(size.width / 2, size.height / 2);_drawRing(canvas, size);_drawRedCircle(canvas, size);_drawGreenCircle(canvas, size);}//绘制环void _drawRing(Canvas canvas, Size size) {final double strokeWidth = 5;_paint..color = Colors.blue..style = PaintingStyle.stroke..strokeWidth = strokeWidth;canvas.drawCircle(Offset.zero, size.width / 2 - strokeWidth, _paint);}// 绘制红球void _drawRedCircle(Canvas canvas, Size size) {canvas.save();canvas.rotate(angleAnimation.value * 2 * pi);_paint..color = Colors.red..style = PaintingStyle.fill;canvas.drawCircle(Offset.zero.translate(0, -(size.width / 2 - 5)), 5, _paint);canvas.restore();}// 绘制绿球void _drawGreenCircle(Canvas canvas, Size size) {canvas.save();canvas.translate(0,angleAnimation.value * (size.height-10));_paint..color = Colors.green..style = PaintingStyle.fill;canvas.drawCircle(Offset.zero.translate(0, -(size.width / 2 - 5)), 5, _paint);canvas.restore();}@overridebool shouldRepaint(covariant CurveBoxPainter oldDelegate) =>oldDelegate.repaint != repaint;
}

2. Flutter所有内置的曲线效果

当我们将曲线效果颜色封装成一个组件之后,就可以非常轻松的实现下面的效果。这就是Flutter的魅力。一共41个曲线效果。

void main() {// 确定初始化WidgetsFlutterBinding.ensureInitialized();//横屏SystemChrome.setPreferredOrientations([DeviceOrientation.landscapeLeft, DeviceOrientation.landscapeRight]);//全屏显示SystemChrome.setEnabledSystemUIOverlays([]);runApp(MyApp());
}class MyApp extends StatelessWidget {final curvesMap = {"linear": Curves.linear,"decelerate": Curves.decelerate,"fastLinearToSlowEaseIn": Curves.fastLinearToSlowEaseIn,"ease": Curves.ease,"easeIn": Curves.easeIn,"easeInToLinear": Curves.easeInToLinear,"easeInSine": Curves.easeInSine,"easeInQuad": Curves.easeInCubic,"easeInCubic": Curves.easeInCubic,"easeInQuart": Curves.easeInQuart,"easeInQuint": Curves.easeInQuint,"easeInExpo": Curves.easeInExpo,"easeInCirc": Curves.easeInCirc,"easeInBack": Curves.easeInBack,"easeOut": Curves.easeOut,"linearToEaseOut": Curves.linearToEaseOut,"easeOutSine": Curves.easeOutSine,"easeOutQuad": Curves.easeOutQuad,"easeOutCubic": Curves.easeOutCubic,"easeOutQuart": Curves.easeOutQuart,"easeOutQuint": Curves.easeOutQuint,"easeOutExpo": Curves.easeOutExpo,"easeOutCirc": Curves.easeOutCirc,"easeOutBack": Curves.easeOutBack,"easeInOut": Curves.easeInOut,"easeInOutSine": Curves.easeInOutSine,"easeInOutQuad": Curves.easeInOutQuad,"easeInOutCubic": Curves.easeInOutCubic,"easeInOutQuart": Curves.easeInOutQuart,"easeInOutQuint": Curves.easeInOutQuint,"easeInOutExpo": Curves.easeInOutExpo,"easeInOutCirc": Curves.easeInOutCirc,"easeInOutBack": Curves.easeInOutBack,"fastOutSlowIn": Curves.fastOutSlowIn,"slowMiddle": Curves.slowMiddle,"bounceIn": Curves.bounceIn,"bounceOut": Curves.bounceOut,"bounceInOut": Curves.bounceInOut,"elasticIn": Curves.elasticIn,"elasticInOut": Curves.elasticInOut,"elasticOut": Curves.elasticOut,};@overrideWidget build(BuildContext context) {return MaterialApp(title: 'Flutter Demo',debugShowCheckedModeBanner: false,theme: ThemeData(primarySwatch: Colors.blue,),home: Scaffold(body: Center(child:Wrap(runSpacing: 10,children: curvesMap.keys.map((e) => Column(mainAxisSize: MainAxisSize.min,children: [CurveBox(curve: curvesMap[e]!,),SizedBox(height: 3,),Text(e,style: TextStyle(fontSize: 10),)],)).toList(),),),));}
}
class CurveBox extends StatefulWidget {final Color color;final Curve curve;CurveBox({Key? key, this.color = Colors.lightBlue, this.curve = Curves.linear}): super(key: key);@override_CurveBoxState createState() => _CurveBoxState();
}class _CurveBoxState extends State<CurveBox>with SingleTickerProviderStateMixin {late AnimationController _controller;late Animation<double> _angleAnimation;@overridevoid initState() {super.initState();_controller = AnimationController(duration: const Duration(seconds: 3),vsync: this,);_angleAnimation = CurveTween(curve: widget.curve).animate(_controller);_controller.repeat();}@overridevoid dispose() {_controller.dispose();super.dispose();}@overrideWidget build(BuildContext context) {return CustomPaint(size: Size(100, 100),painter: CurveBoxPainter(_controller, _angleAnimation), // 背景);}
}class CurveBoxPainter extends CustomPainter {final Animation<double> repaint; //Animation<double> angleAnimation;Paint _paint = Paint();CurveBoxPainter(this.repaint, this.angleAnimation) : super(repaint: repaint) {}@overridevoid paint(Canvas canvas, Size size) {canvas.clipRect(Offset.zero & size);canvas.translate(size.width / 2, size.height / 2);_drawRing(canvas, size);_drawRedCircle(canvas, size);_drawGreenCircle(canvas, size);}//绘制环void _drawRing(Canvas canvas, Size size) {final double strokeWidth = 5;_paint..color = Colors.blue..style = PaintingStyle.stroke..strokeWidth = strokeWidth;canvas.drawCircle(Offset.zero, size.width / 2 - strokeWidth, _paint);}// 绘制红球void _drawRedCircle(Canvas canvas, Size size) {canvas.save();canvas.rotate(angleAnimation.value * 2 * pi);_paint..color = Colors.red..style = PaintingStyle.fill;canvas.drawCircle(Offset.zero.translate(0, -(size.width / 2 - 5)), 5, _paint);canvas.restore();}// 绘制绿球void _drawGreenCircle(Canvas canvas, Size size) {canvas.save();canvas.translate(0,angleAnimation.value * (size.height-10));_paint..color = Colors.green..style = PaintingStyle.fill;canvas.drawCircle(Offset.zero.translate(0, -(size.width / 2 - 5)), 5, _paint);canvas.restore();}@overridebool shouldRepaint(covariant CurveBoxPainter oldDelegate) =>oldDelegate.repaint != repaint;
}

二、动画器的方法

1.forward和reverse方法

|— forward({double from}) 执行运动直到上界。可指定初始值。(执行完毕就会停止)
|— reverse({double from}) 执行运动到下界。可以指定初始值。(执行完毕之后就会停止)

2.repeat重复执行

repeat|--- double?min,|--- double? max|--- bool reverse=false // 是否反转|--- Duration? period // 周期

3. fling方法

fling也就是猛冲。可以给一个速度。默认为1

4. stop和reset

stop方法是让_ticker停止。这样动画也就停止了。可以传入一个bool值。reset方法也很简单。就是将当前值设置为下界。

void stop({bool canceld=true}){_simukation=null;_lastElapsedDuration=null;_ticker.stop(canceld:canceled)
}void reset(){value=lowerBound;
}

Flutter绘制指南09-动画曲线和方法相关推荐

  1. R语言使用pROC包绘制ROC曲线并使用smooth函数绘制平滑的ROC曲线(方法包括:binormal、density、fitdistr、logcondens、logcondens.smooth)

    R语言使用pROC包绘制ROC曲线并使用smooth函数绘制平滑的ROC曲线(方法包括:binormal.density.fitdistr.logcondens.logcondens.smooth) ...

  2. Flutter绘制指南05-图形的路径添加

    本节目标 [1].了解如何通过移动路径形成形状:直线运动.圆弧运动.圆锥曲线运动.贝塞尔曲线运动 [2].了解路径的[绝对运动]和[相对运动] [3].了解已经在已有的路径中添加其他形状: 添加矩形, ...

  3. Flutter 绘制波浪移动动画效果,曲线和折线图

    简介 上一篇用 Flutter 的 Canvas 画点有趣的图形我们介绍了使用 CustomPaint 绘制自定义形状,可以看到有了图形的平面绘制数学计算方法,我们可以画出所需的形状.本篇我们来介绍线 ...

  4. 使用DashPathEffect绘制一条动画曲线

    引言 以前在做曲线图的时候,一直想实现曲线动态绘制的效果.类似于js图表库中的效果:http://www.highcharts.com/demo/spline-symbols 那个时候没有安卓中没有任 ...

  5. Flutter绘制指南06-颜色的基本操作

    本节目标 [1]. 认识Dart中的颜色表示方式 [2]. 了解颜色,[混合模式]的坐拥1 [3]. 了解如何读取图片中的像素颜色 一. 认识颜色 Color类在dart.ui包下,在Dart里面,颜 ...

  6. Flutter绘制指南10-手势在绘制中的使用

    本节目标 [1]. 了解手势在画布中的使用方式 [2]. 练习绘制,并根据手指滑动完成控制杆的绘制 [3]. 练习绘制,并根据手指滑动完成[刻度尺]的绘制 [4]. 了解如何限制绘制区域 一.控制柄组 ...

  7. Flutter 绘制 3D 效果动画

    前言 本篇我们继续介绍 Flutter 绘图的 Path 的应用.Flutter 的 Path 类提供了一个三维空间的变换方法,可以实现路径在三维空间的平移.旋转等操作,从而可以实现3D 绘制的效果. ...

  8. 2020-08-24绘制ROC   PR曲线 核心方法总结 ,计算AUC核心方法

    #1   绘制ROC AUC   PR曲线 #核心方法 roc_curve(y_test, preds)  #  preds为概率形式 #source code import matplotlib.p ...

  9. python绘制繁花曲线代码_使用python和pygame绘制繁花曲线的方法

    前段时间看了一期<最强大脑>,里面各种繁花曲线组合成了非常美丽的图形,一时心血来潮,想尝试自己用代码绘制繁花曲线,想怎么组合就怎么组合. 真实的繁花曲线使用一种称为繁花曲线规的小玩意绘制, ...

最新文章

  1. solr 5.3.1安装配置
  2. ubuntu php上传文件,Ubuntu中增加apache上传文件大小限制(突破Aapache默认2M上传限制)...
  3. linux命令(51):set 指定行,直接替换并修改文件
  4. C++ 中的类型限定符 类型限定符提供了变量的额外信息。
  5. Python 调用 DLL
  6. python多进程用不了_Python多进程相关的坑
  7. 利用console控制台调试php代码
  8. 数据结构---AVL树调整方法(详)
  9. 解决tomcat能起开,但是访问不进8080首页的问题
  10. SmartDrv的前世今生——PrimoCache_2.2.0汉化
  11. 第五届蓝桥杯java试题答案_2014年第五届蓝桥杯省赛试题(JavaA组)
  12. python图片logo_Python logo
  13. Window纯净系统安装详细教程
  14. 面试经验分享,论如何入职心仪的企业
  15. 2021-08-05,虾皮API,seller_info - 获得shopee店铺详情
  16. Spark SQL 快速入门系列(五)SparkSQL 访问 Hive
  17. SWCTF2022Writeup
  18. tar加减号时的作用 tar cf - | tar xf - 管道 linux
  19. 小白勿进!35岁的程序员被裁,这原因我服了
  20. 神经网络的三种训练方法,训练神经网络作用大吗

热门文章

  1. top和margin-top等的区别
  2. [再寄小读者之数学篇](2014-06-20 Beta 函数)
  3. C语言调用 free 函数释放内存后指针指向及内存中的值是否改变的问题
  4. 写一程序,用scanf函数输入x,输出y值。
  5. 【笔记】html 图片映射 usemap(vue环境下、map、area、coords)
  6. StarUML 3.0.2 快速破解方法
  7. linux多个文件删除重复行,shell中删除文件中重复行的方法
  8. 八、jQuery的QQ音乐播放器
  9. 春节灯笼Html代码实现+点击页面出现文字
  10. 算法小记(1)--判断三个数的最大,最小