之前的几个案例,都是在动画监听控制器中设置了setState,这样比较浪费资源,我们只需要在使用动画的部件中才执行重构。
//监听控制器的动画 _animationController.addListener(() { //动画每次变化重构部件 setState(() {}); });
AinmatedWidget
animatedwidget可以理解为animation的帮助类,在不使用此类添加动画效果的时候,需要手动的添加addListener()并在回调用使用setstate方法才能看到动画的效果,使用animatedwidget可以简化这样的操作,可以理解为创建一个widget自带动画效果。
import 'package:flutter/material.dart'; class AnimateDemo extends StatelessWidget { @override Widget build(BuildContext context) { return AnimateDemoHome(); } } class AnimateDemoHome extends StatefulWidget { @override _AnimateDemoHomeState createState() => _AnimateDemoHomeState(); } class _AnimateDemoHomeState extends State<AnimateDemoHome> with TickerProviderStateMixin { //定义动画控制器变量类型 AnimationController _animationController; Animation _animation; Animation _animationColor; CurvedAnimation _curvedAnimation; @override void initState() { // TODO: implement initState super.initState(); //创建动画控制器 _animationController = AnimationController( duration: Duration(milliseconds: 3000), vsync: this, ); //设置动画曲线 _curvedAnimation=CurvedAnimation(parent:_animationController,curve: Curves.bounceOut ); //创建Tween设置动画运动的值,会返回一个Animation,通过这个变量可以控制动画 _animation= Tween(begin:200.0,end:400.0).animate(_curvedAnimation); //生成颜色 _animationColor=ColorTween(begin: Colors.red[100],end: Colors.red[900]).animate(_curvedAnimation); // //监听控制器的动画 // _animationController.addListener(() { // //动画每次变化重构部件 // setState(() {}); // }); //监听动画的状态 _animationController.addStatusListener((AnimationStatus status) { print(status); }); _animationController.forward(); } @override void dispose() { // TODO: implement dispose //销毁动画 _animationController.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Animate案例'), ), body: Center( child:AnimatedHeart( animations: [ _animation, _animationColor ], animationController:_animationController , ), ), ); } } //创建一个动画类继承自animatedwidget(其中可以通过构造函数传入必要的动画) class AnimatedHeart extends AnimatedWidget{ //存放小部件动画 final List animations; //动画控制器 final AnimationController animationController; AnimatedHeart({this.animations,this.animationController}):super(listenable:animationController); @override Widget build(BuildContext context) { // TODO: implement build return Container( width: animations[0].value, height: animations[0].value, color: animations[1].value, ); } }
发表评论
侧栏公告
寄语
譬如朝露博客是一个分享前端知识的网站,联系方式11523518。
热评文章
标签列表
热门文章
友情链接