打开一个APP,经常会看到精美的启动页,这种启动页也称为闪屏动画。它是从无到有有一个透明度的渐变动画的。图像展示完事后,才跳转到用户可操作的页面。这节课主要学习一下闪屏动画的制作
AnimationController
AnimationController是Animation的一个子类,它可以控制Animation, 也就是说它是来控制动画的,比如说控制动画的执行时间
我们这里有了两个参数 :
- vsync:垂直同步设置,使用this就可以了vsync:this。
- duration: 动画持续时间,这个可以使用秒(seconds),也可以使用毫秒(milliseconds),工作中经常使用毫秒,因为秒还是太粗糙了
来看一段代码,这段代码就是控制动画的一个典型应用。
_controller = AnimationController(vsync:this,duration:Duration(milliseconds:3000));_animation = Tween(begin: 0.0,end:1.0).animate(_controller);
这段代码的意思是,设置一个动画控制器,这个动画控制器控制动画执行时间是3000毫秒。然后我们设置了一段动画,动画使用了动画控制器的约定
animation.addStatusListener
animation.addStatusListener动画事件监听器,它可以监听到动画的执行状态,我们这里只监听动画是否结束,如果结束则执行页面跳转动作。
_animation.addStatusListener((status){if(status == AnimationStatus.completed){Navigator.of(context).pushAndRemoveUntil(MaterialPageRoute(builder: (context)=>MyHomePage()),(route)=> route==null);}});
- AnimationStatus.completed:表示动画已经执行完毕。
- pushAndRemoveUntil:跳转页面,并销毁当前控件。
案例重要代码
我们会了上边的知识点,做出案例就没什么问题了。我把复杂的代码都作了注释。
主文件main.dart文件
import 'package:flutter/material.dart';import 'splash_screen.dart';void main() => runApp(MyApp());class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return MaterialApp(title: 'Flutter Demo',theme: ThemeData(primarySwatch:Colors.blue,),home:SplashScreen());}}
splash_screen.dart文件
import 'package:flutter/material.dart';import 'pages/index_page.dart';class SplashScreen extends StatefulWidget {_SplashScreenState createState() => _SplashScreenState();}class _SplashScreenState extends State<SplashScreen> with SingleTickerProviderStateMixin {AnimationController _controller;Animation _animation;void initState() {super.initState();_controller = AnimationController(vsync:this,duration:Duration(milliseconds:3000));_animation = Tween(begin: 0.0,end:3.0).animate(_controller);/*动画事件监听器,它可以监听到动画的执行状态,我们这里只监听动画是否结束,如果结束则执行页面跳转动作。 */_animation.addStatusListener((status){if(status == AnimationStatus.completed){Navigator.of(context).pushAndRemoveUntil(MaterialPageRoute(builder: (context)=>IndexPage()),(route)=> route==null);}});//播放动画_controller.forward();}@overridevoid dispose() {_controller.dispose();super.dispose();}@overrideWidget build(BuildContext context) {return FadeTransition( //透明度动画组件opacity: _animation, //执行动画child: Image.network( //网络图片'http://n.sinaimg.cn/sinakd10112/175/w1080h1495/20200326/f2ac-irkazzv3170145.jpg',scale: 2.0, //进行缩放fit:BoxFit.cover // 充满父容器),);}}
home_page.dart文件
import 'package:flutter/material.dart';class MyHomePage extends StatelessWidget {@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title:Text('首页')),body:Center(child: Text('我是首页')));}}
