Flutter七日游第二天----2018-12-17----天气晴朗
零前言:
昨天讲了一下Flutter的基础项目,介绍了一下Dart语言,简单的用Canvas绘个图
本来打算今天把内置控件看一下的,不过既然昨天把图都画了,今天不玩动画岂不可惜
今天主要是把动画理一下,顺便把Android-java粒子运动复刻到Flutter-Dart里
最后会实现一个粒子时钟,Java版详见:Android原生绘图之炫酷倒计时
所以这篇会挺好玩的,瓜子,饮料,花生米备好,开始看吧
先挑几个图镇楼吧
运动盒 | 粉碎球 |
---|---|
星与芒 | 星扩动 |
---|---|
一、入门级动画:五角星的长大
1.照葫芦画瓢
按照昨天的Flutter初始项目,我们来自己写一个
本人是喜欢分包的,Javaer的优良习惯。至少逻辑清晰,分工明确,我创建了一个pager包
主页面内容用AnimaPage,虽然暂时还不知道StatefulWidget是什么,反正按照套路出牌就行了
仿照初始项目的套路写,这里绘图区自定义AnimaView,打算对五角星的外接圆半径R进行动画
1 | import 'package:flutter/cupertino.dart'; |
2.AnimaView的实现:
n角星的路径第一天已经封装好了,不会的可以去看一下
1 | import 'dart:ui'; |
3.让数据动起来
现在万事俱备,只欠东风把R的值吹动就行了,下面有请Animation登场
vsync需要with SingleTickerProviderStateMixi
Tween:补间动画—-这里即:在 25.0, ~ 150.0之间在2000ms之内均匀变化
(PS:由于程序运行情况不同,并非绝对均匀,但整体上是均匀的)..
:是级联运算,相当于再使用此对象,这里..
也就代表animation.
1 | class AnimaPage extends StatefulWidget { |
这样最简单的动画就动起来了
4.来理一理思路
把源码翻一翻,感觉整个动画体系也不是非常复杂
套路就是:Animatable用animate方法,把一个Animation包裹一下,形成一个更厉害的Animation
至于他们的n个儿子,也就是对数据的处理不同,产生的效果不同罢了,套路知道了,一切好办
可以看出api并没有想象中的那么多,所以别怕
二、入门级动画:五角星的绽放
前面用了补间动画Tween,而且只动了一下,下面带来连续运动的不均匀动画
匀速往复动 | 自定义曲线 | bounceInOut |
---|---|---|
1.往复运动
1.1:运动状态
你可以想象成一个人在一个范围数字跑道上跑步:
1 | enum AnimationStatus { |
1.2:状态的监听
addStatusListener
:可以监听当前运动状态:只要让它跑完了,再往回跑就行了
1 | animation = Tween(begin: 25.0, end: 150.0).animate(controller) |
2.变速跑
就像运动员变速跑一样,感觉就像游戏里加buff,本来是匀速的Animation
给价格变速的buff就变速起来了,加buff的类就是Animatable
,它的子类有一个CurveTween
:
1 | animation = Tween(begin: 25.0, end: 150.0).animate( |
就这么简单,Curves里有几个内置的变速器,给原来的animation装上就行了
3.自定义变速曲线
3.1:追踪一下源码
1 | ---->[CurveTween]---------控件只有一参Curve------------------------ |
3.2:Chrome小工具
作为一名前端业余爱好者,Chrome里有个小东西很有用,
曲线生成,自带预览,简直无心插柳柳成荫。(记得掘金的头像可以转,有translate属性)
3.3:使用:
1 | animation = Tween(begin: 25.0, end: 150.0).animate( |
Ok,基本上就这样,你get了吗?
三、初级动画:太阳的诞生
红太阳 | 星与阳 |
---|---|
1.红太阳:整型int 动画
套路学会了,这些动态改变一下n角星的尖角数,看看效果
1.1:AnimaPage里定义尖角数动画
1 | Animation<int> numAnima;//n角星的尖角数动画 |
1.2:AnimaView增加入参
1 | int _num; |
2.星与阳:颜色动画
ColorTween
相当于添加颜色改变的buff,入参的自己加吧,和上面一样,给画笔填色就行了
1 | colorAnima = |
3.其他效果
自己玩玩吧,随便改些属性
星与芒 | 星扩动 |
---|---|
星与芒:固定五角星内接圆半径,外接圆半径变大,角数变多,颜色变红
星扩动:五角星内接圆半径为外接圆一半,外接圆半径变大,角数变多,颜色变红
好了,预热完了,下面进入正题
四、粒子运动
无论什么语言只有能模拟
时间流
就可以有粒子动画
粒子动画的基础在Android原生绘图之让你了解View的运动里讲的很详细
思想对于所有语言都是通用的,不仅限于java,有兴趣的可以详细了解下
1.废话不多说,来个运动盒
再说
运动盒
就是小球在盒子里不断弹跳的动画,就像这样
1.1:新建文件:run_ball_view.dart----->RunBallView + Ball
先把小球的实体类写一下
1 | class Ball { |
1.2:画板准备好
1 | class RunBallView extends CustomPainter { |
1.3:认识一下矩形对象Rect
这是我们需要的字段
1 | var limit = Rect.fromLTRB(-140, -100, 140, 100); |
1.4:新建文件:run_ball_pager.dart---->RunBallPage
这里只需要一个时间流,用
AnimationController
一个人就够了
1 | class RunBallPage extends StatefulWidget { |
这样静态小球就完成了
1.5:更新新小球位置,渲染视图:RunBallPage#updateBall
1 | //更新小球位置 |
1.6:运动盒的实现
1 | //初始时附加信息 |
2.粒子的运动
思路就是:用List把球装一下,碰撞的时候,创建一个方向相反,半径减半的球,加入集合
并将当前的球半径减半,效果挺不错的,实现起来也不麻烦。Android-java版可见
2.1:改动:RunBallPage
半径小于0.3就移除,为了不让小球无限增加,小于0.3基本上也就卡不见了
当然你也可以自定义移除的时机
1 | var _balls = List<Ball>();//将_ball换成集合 |
2.2:绘制小球时:RunBallView
:
把小球都绘制出来就行了
1 | //复制一个小球 |
这样就完成了,是不是没有想象中的那么复杂
五、粒子时钟
这里就不详细分析,这里的Java版已经分析的很细致了,直接上代码(基本上是Java的翻译版)
这个效果新建了一个页面来做,digit三维数组Dart版附在文尾
1.渲染数字
1 | /** |
2.画布中绘制1994
1 | canvas.save(); |
3.绘制时间
3.1:时间的简单获取
1 | DateTime now = new DateTime.now(); |
3.2:绘制时间
1 | //时 |
3.3:用Animation动起来
4.加小球
方法基本上是Java版改些的,这里不分析了,可以看Java版的分析,基本上一致
1 | //在类的外部定义全局的变量 |
好了,今天就这样,内容有点多,现在Dart的语法越用越熟练了
附录
1 | //颜色常量 |