打开一个APP,经常会看到精美的启动页,这种启动页也称为闪屏动画。它是从无到有有一个透明度的渐变动画的。图像展示完事后,才跳转到用户可操作的页面。这节课主要学习一下闪屏动画的制作

打开应用的闪屏动画案例 - 图1


AnimationController

AnimationController是Animation的一个子类,它可以控制Animation, 也就是说它是来控制动画的,比如说控制动画的执行时间

我们这里有了两个参数 :

  • vsync:垂直同步设置,使用this就可以了vsync:this。
  • duration: 动画持续时间,这个可以使用秒(seconds),也可以使用毫秒(milliseconds),工作中经常使用毫秒,因为秒还是太粗糙了

来看一段代码,这段代码就是控制动画的一个典型应用。

  1. _controller = AnimationController(vsync:this,duration:Duration(milliseconds:3000));
  2. _animation = Tween(begin: 0.0,end:1.0).animate(_controller);

这段代码的意思是,设置一个动画控制器,这个动画控制器控制动画执行时间是3000毫秒。然后我们设置了一段动画,动画使用了动画控制器的约定

animation.addStatusListener

animation.addStatusListener动画事件监听器,它可以监听到动画的执行状态,我们这里只监听动画是否结束,如果结束则执行页面跳转动作。

  1. _animation.addStatusListener((status){
  2. if(status == AnimationStatus.completed){
  3. Navigator.of(context).pushAndRemoveUntil(
  4. MaterialPageRoute(builder: (context)=>MyHomePage()),
  5. (route)=> route==null);
  6. }
  7. });
  • AnimationStatus.completed:表示动画已经执行完毕。
  • pushAndRemoveUntil:跳转页面,并销毁当前控件。

案例重要代码

我们会了上边的知识点,做出案例就没什么问题了。我把复杂的代码都作了注释。

主文件main.dart文件

  1. import 'package:flutter/material.dart';
  2. import 'splash_screen.dart';
  3. void main() => runApp(MyApp());
  4. class MyApp extends StatelessWidget {
  5. @override
  6. Widget build(BuildContext context) {
  7. return MaterialApp(
  8. title: 'Flutter Demo',
  9. theme: ThemeData(
  10. primarySwatch:Colors.blue,
  11. ),
  12. home:SplashScreen()
  13. );
  14. }
  15. }

splash_screen.dart文件

  1. import 'package:flutter/material.dart';
  2. import 'pages/index_page.dart';
  3. class SplashScreen extends StatefulWidget {
  4. _SplashScreenState createState() => _SplashScreenState();
  5. }
  6. class _SplashScreenState extends State<SplashScreen> with SingleTickerProviderStateMixin {
  7. AnimationController _controller;
  8. Animation _animation;
  9. void initState() {
  10. super.initState();
  11. _controller = AnimationController(vsync:this,duration:Duration(milliseconds:3000));
  12. _animation = Tween(begin: 0.0,end:3.0).animate(_controller);
  13. /*动画事件监听器,
  14. 它可以监听到动画的执行状态,
  15. 我们这里只监听动画是否结束,
  16. 如果结束则执行页面跳转动作。 */
  17. _animation.addStatusListener((status){
  18. if(status == AnimationStatus.completed){
  19. Navigator.of(context).pushAndRemoveUntil(
  20. MaterialPageRoute(builder: (context)=>IndexPage()),
  21. (route)=> route==null);
  22. }
  23. });
  24. //播放动画
  25. _controller.forward();
  26. }
  27. @override
  28. void dispose() {
  29. _controller.dispose();
  30. super.dispose();
  31. }
  32. @override
  33. Widget build(BuildContext context) {
  34. return FadeTransition( //透明度动画组件
  35. opacity: _animation, //执行动画
  36. child: Image.network( //网络图片
  37. 'http://n.sinaimg.cn/sinakd10112/175/w1080h1495/20200326/f2ac-irkazzv3170145.jpg',
  38. scale: 2.0, //进行缩放
  39. fit:BoxFit.cover // 充满父容器
  40. ),
  41. );
  42. }
  43. }

home_page.dart文件

  1. import 'package:flutter/material.dart';
  2. class MyHomePage extends StatelessWidget {
  3. @override
  4. Widget build(BuildContext context) {
  5. return Scaffold(
  6. appBar: AppBar(title:Text('首页')),
  7. body:Center(
  8. child: Text('我是首页')
  9. )
  10. );
  11. }
  12. }

附件

打开应用的闪屏动画案例-lib.zip