底层自定义动画
3.1 Flutter动画原理
Flutter内部通过setState()
函数刷新页面,且flutter优化得相当好,一秒执行60/120次也不会有卡顿。
Ticker原理:屏幕每刷新一帧,称为一个ticker:
Ticker _ticker = Ticker((elapsed) {
print("Tick: $elapsed"); //elapsed是运行总时长
})..start();
你可以通过下列方式手动制作一个Ticker(仅作为实验用途,不推荐):
double _height = 300;
@override
void initState(){
Ticker _ticker = Ticker((_) => setState((){
_height --;
if(_height <= 0) _height = 300;
}))..start();
super.initState();
}
上述程序虽然可以运行,但首先,它没有考虑一些特殊情况,如程序暂时退出、切换到其他程序时,动画应该暂停。其次,每一帧时_height--
,则在60帧的屏幕下该动画需要5秒执行完毕,而在120hz屏幕下只需要2.5秒。
3.2 Hero动画(主动画)
将需要做Hero动画的控件包裹上Hero,并给它一个tag属性,两个页面对应控件的tag一致。
如果两个页面中的控件样式不一致,或者类型不统一,那么会瞬间切换,不会有控件切换时的动画效果。
3.3 CustomPaint
Tips:要使Container占满屏幕,使用
Container(
constraints: BoxConstraints.expand(),
//或者
width: double.infinity,
height: double.infinity,
)