文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Flutter怎么使用AnimatedBuilder实现动效复用

2023-06-29 20:21

关注

这篇文章主要介绍“Flutter怎么使用AnimatedBuilder实现动效复用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Flutter怎么使用AnimatedBuilder实现动效复用”文章能帮助大家解决问题。

前言

我们之前讲述了动画构建的两种方式,Animation 和 AnimationWidget,这两种构建动画都是将组件和动画一起完成的。有些时候,我们只是想动效复用,而不关心组件构建,这个时候就可以使用 AnimatedBuilder 了。

AnimatedBuilder 介绍

根据官方文档说明,AnimatedBuilder 的使用要点如下:

这段话的核心要点就是 AnimatedBuilder 应该只负责动画效果的管理,而不应该管理组件构建。如果混在一起使用,就失去设计者的初衷了。这就好比我们的状态管理和界面一样,一个负责业务逻辑,一个负责界面渲染,从而实现解耦和复用。这个AnimatedBuilder就是专门复制动效管理的,并且应当努力实现复用。AnimatedBuilder的定义如下:

const AnimatedBuilder({    Key? key,    required Listenable animation,    required this.builder,    this.child,  }) : assert(animation != null),       assert(builder != null),       super(key: key, listenable: animation);

其中关键的参数是builderbuilder 用于构建组件的转变动作,在 builder 里可以对要渲染的子组件进行转变操作,然后返回变换后的组件。builder 的定义如下,其中 child 实际就是 AnimatedBuilder 的 child 参数,可以根据需要是否使用。

Widget Function(BuildContext context, Widget? child)

Transform 组件介绍

在 Flutter 中,提供了一个专门用于对子组件进行转换操作的,定义如下:

const Transform({    Key? key,    required this.transform,    this.origin,    this.alignment,    this.transformHitTests = true,    Widget? child,  }) : assert(transform != null),       super(key: key, child: child);

这里的参数说明如下:

我们可以通过 Transform,实现 AnimatedBuilder 的动效管理,也就是在 AnimatedBuilder 中,通过构建 Transform 对象实现动效。

应用

基本概念讲清楚了(敲黑板:很多时候大家都是直接简单看一下文档就开始用,甚至干脆复制示例代码就上,结果很可能会用得不对),可以开始撸代码了。我们来实现下面的动效。

Flutter怎么使用AnimatedBuilder实现动效复用

这里其实是两个组件,通过 AnimatedBuilder 做了动效转换。在动效的一半时间是文字“点击按钮变出小姐姐”,之后的一半将组件更换为了小姐姐的图片了。使用AnimatedBuilder 的实现代码如下:

class RotationSwitchAnimatedBuilder extends StatelessWidget {  final Widget child1, child2;  final Animation<double> animation;  const RotationSwitchAnimatedBuilder(      {Key? key,      required this.animation,      required this.child1,      required this.child2})      : super(key: key);  @override  Widget build(BuildContext context) {    return AnimatedBuilder(      animation: animation,      builder: (context, child) {        if (animation.value < 0.5) {          return Transform(            transform: Matrix4.identity()              ..rotateZ(animation.value * pi)              ..setEntry(0, 1, -0.003),            alignment: Alignment.center,            child: child1,          );        } else {          return Transform(            transform: Matrix4.identity()              ..rotateZ(pi)              ..rotateZ(animation.value * pi)              ..setEntry(1, 0, 0.003),            child: child2,            alignment: Alignment.center,          );        }      },    );  }}

注意第2个组件多转了180度,是未来保证停止后正好旋转360度,以免图片倒过来。另外就是这里的 child1和 child2也可以修改为使用 WidgetBuilder 函数来在需要的时候再构建组件。使用这个RotationSwitchAnimatedBuilder的组件就十分简单了,将需要操作的两个组件作为参数传过来,然后控制 Animation 对象来刷新界面就好了,对应的代码如下:

class AnimatedBuilderDemo extends StatefulWidget {  const AnimatedBuilderDemo({Key? key}) : super(key: key);  @override  _AnimatedBuilderDemoState createState() => _AnimatedBuilderDemoState();}class _AnimatedBuilderDemoState extends State<AnimatedBuilderDemo>    with SingleTickerProviderStateMixin {  late Animation<double> animation;  late AnimationController controller;  @override  void initState() {    super.initState();    controller =        AnimationController(duration: const Duration(seconds: 1), vsync: this);    animation = Tween<double>(begin: 0, end: 1.0).animate(controller);  }  @override  Widget build(BuildContext context) {    return Scaffold(      appBar: AppBar(        title: Text('AnimatedBuilder 动画'),      ),      body: RotationSwitchAnimatedBuilder(        animation: animation,        child1: Center(          child: Container(            padding: EdgeInsets.all(10),            margin: EdgeInsets.all(10),            constraints: BoxConstraints(minWidth: double.infinity),            decoration: BoxDecoration(              borderRadius: BorderRadius.circular(4.0),              gradient: LinearGradient(                colors: [                  Colors.orange,                  Colors.green,                ],              ),            ),            child: Text(              '点击按钮变出小姐姐',              style: TextStyle(                fontSize: 20,                color: Colors.white,                fontWeight: FontWeight.bold,              ),              textAlign: TextAlign.center,            ),          ),        ),        child2: Center(          child: Image.asset('images/beauty.jpeg'),        ),      ),      floatingActionButton: FloatingActionButton(        child: Icon(Icons.play_arrow, color: Colors.white),        onPressed: () {          if (controller.status == AnimationStatus.completed) {            controller.reverse();          } else {            controller.forward();          }        },      ),    );  }  @override  void dispose() {    controller.dispose();    super.dispose();  }}

复用的话也很容易了,比如我们将一个圆形和一个矩形组件传过去,一样可以复用这个动画效果。

Flutter怎么使用AnimatedBuilder实现动效复用

关于“Flutter怎么使用AnimatedBuilder实现动效复用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网行业资讯频道,小编每天都会为大家更新不同的知识点。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯