Flutter-加载中动画

效果

考察内容

  • AnimationController
  • Tween
  • AnimatedBuilder
  • Transform
  • Matrix4

实现

///源码:https://github.com/yixiaolunhui/flutter_xy
class LoadingView extends StatefulWidget {
  const LoadingView({Key? key}) : super(key: key);

  @override
  State<LoadingView> createState() => _LoadingViewState();
}

class _LoadingViewState extends State<LoadingView>
    with TickerProviderStateMixin {
  late AnimationController _controller;
  late Animation<double> _rotationAnimation;
  late Animation<double> _radiusAnimation;
  var size = 160.0;

  @override
  void initState() {
    super.initState();
    _controller = AnimationController(
      duration: const Duration(seconds: 2),
      vsync: this,
    );

    _rotationAnimation = Tween<double>(begin: 0.0, end: pi)
        .chain(CurveTween(curve: Curves.easeInOut))
        .animate(_controller);

    _radiusAnimation = Tween(begin: size / 2, end: 5.0)
        .chain(CurveTween(curve: Curves.easeInOut))
        .animate(_controller);

    _controller.addStatusListener((status) {
      if (status == AnimationStatus.completed) {
        _rotationAnimation = Tween<double>(
          begin: _rotationAnimation.value % (2 * pi),
          end: _rotationAnimation.value % (2 * pi) + pi,
        ).chain(CurveTween(curve: Curves.easeInOut)).animate(_controller);
        _radiusAnimation = Tween<double>(
          begin: _radiusAnimation.value == size / 2 ? size / 2 : 5.0,
          end: _radiusAnimation.value == size / 2 ? 5.0 : size / 2,
        ).chain(CurveTween(curve: Curves.easeInOut)).animate(_controller);
        _controller
          ..reset()
          ..forward();
      }
    });
    _controller.forward();
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return AnimatedBuilder(
      animation: _controller,
      builder: (BuildContext context, Widget? child) {
        return Stack(
          clipBehavior: Clip.none,
          alignment: Alignment.center,
          children: [
            for (var i = 0; i < 5; i++)
              Transform(
                alignment: Alignment.center,
                transform: Matrix4.identity()
                  ..rotateZ(_rotationAnimation.value + i * 0.2),
                child: Container(
                  width: size - i * 30,
                  height: size - i * 30,
                  decoration: BoxDecoration(
                    color: Colors.deepPurple[400 - i * 100],
                    borderRadius: BorderRadius.circular(_radiusAnimation.value),
                  ),
                ),
              ),
          ],
        );
      },
    );
  }
}

使用

///源码:https://github.com/yixiaolunhui/flutter_xy
class LoadingPage extends StatelessWidget {
  const LoadingPage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("动画"),
      ),
      body: const Center(child: LoadingView()),
    );
  }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Flutter 加载动画是指在数据加载或处理过程为用户提供的视觉反馈。在 Flutter ,我们可以使用多种方法来实现加载动画。 一种常见的方式是使用 Flutter 自带的 CircularProgressIndicator 组件。这是一个圆形进度指示器,可以显示加载进度的百分比。我们可以通过设置 value 属性来控制进度的大小,通常可以将它与 FutureBuilder 或 StreamBuilder 结合使用来显示网络请求或异步操作的进度。此外,我们还可以通过设置颜色和线条粗细等属性来自定义 CircularProgressIndicator 的外观。 除了 CircularProgressIndicator,Flutter 还提供了许多其他的加载动画,比如 LinearProgressIndicator、RefreshIndicator 等。LinearProgressIndicator 是一个线性进度指示器,适用于表示长时间操作的进度。RefreshIndicator 则是下拉刷新的效果,用户在列表或页面顶部下拉时,会出现一个圈圈的加载动画,表示正在刷新数据。 除了使用预置的加载动画组件,我们还可以通过自定义动画来实现更丰富的加载效果。Flutter 提供了强大的动画库和组件,如 AnimatedContainer、AnimationController 等,使得创建自定义加载动画变得更加方便。 总之,Flutter 提供了各种加载动画的选择,无论是使用预置组件还是自定义动画,都可以根据项目需求和个人喜好来实现加载效果。这些加载动画可以提升用户体验,让用户在等待数据加载时感到更舒适和愉悦。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值