前言
Flutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的原生用户界面。
IT界著名的尼古拉斯·高尔包曾说:轮子是IT进步的阶梯!热门的框架千篇一律,好用轮子万里挑一!Flutter作为这两年开始崛起的跨平台开发框架,其第三方生态相比其他成熟框架还略有不足,但轮子的数量也已经很多了。本系列文章挑选日常app开发常用的轮子分享出来,给大家提高搬砖效率,同时也希望flutter的生态越来越完善,轮子越来越多。
本系列文章准备了超过50个轮子推荐,工作原因,尽量每1-2天出一篇文章。
tip:本系列文章合适已有部分flutter基础的开发者,入门请戳:flutter官网
正文
轮子
- 轮子名称:flutter_staggered_animations
- 轮子概述:轻松的将交错的动画添加到您ListView,GridView,Column和Row
- 推荐指数:★★★★
- 常用指数:★★★
-
效果预览:
效果图
安装
flutter_staggered_animations: "^0.1.2"
import 'package:flutter_staggered_animations/flutter_staggered_animations.dart';
用法介绍
flutter_staggered_animations提供三个类:
- Animation
- AnimationConfiguration
- AnimationLimiter
以及四个默认动画类型:
- FadeInAnimation 渐隐渐现动画
- SlideAnimation 滑动动画
- ScaleAnimation 缩放动画
- FlipAnimation 翻转动画
(动画可嵌套成组合动画)
在ListView中使用
动画外部由AnimationLimiter组件包裹,ListView的子项由AnimationConfiguration.staggeredList来创建:
int count=20;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("ListView"),
),
body: AnimationLimiter(
child:ListView.builder(
itemCount: count,
itemBuilder: (context,index){
return AnimationConfiguration.staggeredList(
position: index,
duration: const Duration(milliseconds: 375),
child: SlideAnimation( //滑动动画
verticalOffset: 50.0,
child: FadeInAnimation( //渐隐渐现动画
child: Container(
margin: EdgeInsets.all(5),
color: Theme.of(context).primaryColor,
height: 60,
),
),
),
);
},
),
),
);
}
在GridView中使用
动画外部由AnimationLimiter组件包裹,GridView的子项由AnimationConfiguration.staggeredGrid来创建:
int count=20;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("GridView"),
),
body:
AnimationLimiter(
child:GridView.builder(
itemCount: count,
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
//横轴元素个数
crossAxisCount: 3,
//纵轴间距
mainAxisSpacing: 10.0,
//横轴间距
crossAxisSpacing: 10.0,
//子组件宽高长度比例
childAspectRatio: 1.0
),
itemBuilder: (context,index){
return AnimationConfiguration.staggeredGrid(
columnCount:count,
position: index,
duration: const Duration(milliseconds: 375),
child: SlideAnimation(
verticalOffset: 50.0,
child: FadeInAnimation(
child: Container(
color: Theme.of(context).primaryColor,
),
),
),
);
},
),
),
);
}
在Column中使用
动画外部由AnimationLimiter组件包裹,Column的子项由AnimationConfiguration.toStaggeredList来创建:
int count=10;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Column"),
),
body:
AnimationLimiter(
child:Column(
children:AnimationConfiguration.toStaggeredList(
duration: const Duration(milliseconds: 375),
childAnimationBuilder:(widget) => SlideAnimation(
verticalOffset: 50.0,
child: FadeInAnimation(
child: widget,
),
),
children: ChildrenList()
)
),
),
);
}
List<Widget> ChildrenList(){
List<Widget> childs=[];
for (var i = 0; i < count; i++) {
childs.add(Container(
margin: EdgeInsets.all(5),
color: Theme.of(context).primaryColor,
height: 60,
));
}
return childs;
}
在Row中使用
动画外部由AnimationLimiter组件包裹,Row的子项由AnimationConfiguration.toStaggeredList来创建:
int count=5;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Row"),
),
body:
AnimationLimiter(
child:Container(
height: 60,
child: Row(
children:AnimationConfiguration.toStaggeredList(
duration: const Duration(milliseconds: 375),
childAnimationBuilder:(widget) => SlideAnimation(
verticalOffset: 50.0,
child: FadeInAnimation(
child: widget,
),
),
children: ChildrenList()
)
),
),
),
);
}
List<Widget> ChildrenList(){
List<Widget> childs=[];
for (var i = 0; i < count; i++) {
childs.add(Container(
margin: EdgeInsets.only(right:5),
color: Theme.of(context).primaryColor,
width: 60,
));
}
return childs;
}
网友评论