flutter好用的轮子推荐一:列表动画

前言

Flutter是谷歌的移动UI框架,能够快速在iOS和Android上构建高质量的原生用户界面。git

IT界著名的尼古拉斯·高尔包曾说:轮子是IT进步的阶梯!热门的框架千篇一概,好用轮子万里挑一!Flutter做为这两年开始崛起的跨平台开发框架,其第三方生态相比其余成熟框架还略有不足,但轮子的数量也已经不少了。本系列文章挑选平常app开发经常使用的轮子分享出来,给你们提升搬砖效率,同时也但愿flutter的生态愈来愈完善,轮子愈来愈多。github

本系列文章准备了超过50个轮子推荐,工做缘由,尽可能每1-2天出一篇文章。app

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提供三个类:ide

  • Animation
  • AnimationConfiguration
  • AnimationLimiter

以及四个默认动画类型:动画

  • FadeInAnimation 渐隐渐现动画
  • SlideAnimation 滑动动画
  • ScaleAnimation 缩放动画
  • FlipAnimation 翻转动画 (动画可嵌套成组合动画)

在ListView中使用

动画外部由AnimationLimiter组件包裹,ListView的子项由AnimationConfiguration.staggeredList来建立:ui

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来建立:spa

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来建立:code

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来建立:cdn

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;
}
复制代码

结尾

相关文章
相关标签/搜索