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. 登录动画

    2024-05-12 06:10:06       43 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-05-12 06:10:06       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-12 06:10:06       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-12 06:10:06       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-12 06:10:06       18 阅读

热门阅读

  1. mysql字段乱序 information_schema

    2024-05-12 06:10:06       9 阅读
  2. MySQL 事务的隔离级别

    2024-05-12 06:10:06       8 阅读
  3. Php 如何使用进程

    2024-05-12 06:10:06       5 阅读
  4. 常用设计模式

    2024-05-12 06:10:06       9 阅读
  5. html的基础知识和常见的语法简单归纳

    2024-05-12 06:10:06       8 阅读
  6. 【代码】Mysql 查询近一个月各类型设备新增数量

    2024-05-12 06:10:06       10 阅读
  7. CMake 学习笔记(访问Python)

    2024-05-12 06:10:06       10 阅读