iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >Flutter使用AnimatedBuilder实现动效复用
  • 289
分享到

Flutter使用AnimatedBuilder实现动效复用

2024-04-02 19:04:59 289人浏览 安东尼
摘要

目录前言AnimatedBuilder 介绍TransfORM 组件介绍应用总结前言 我们之前讲述了动画构建的两种方式,Animation 和 Animation

前言

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

AnimatedBuilder 介绍

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

  • An AnimatedBuilder understands how to render the transition. —— AnimatedBuilder 知道如何渲染转场动效。
  • An AnimatedBuilder doesn’t know how to render the widget, nor does it manage the Animation object. —— AnimatedBuilder 不知道(或者准确说不应)如何渲染组件,也不管理组件对象。
  • Use AnimatedBuilder to describe an animation as part of a build method for another widget. If you simply want to define a widget with a reusable animation, use an AnimatedWidget. —— 使用 AnimatedBuilder 作为其他组件的动效描述。如果只是想复用一个带有动效的组件,那么应该使用 AnimatedWidget。这个可以看我们之前关于 AnimatedWidget 的介绍:Flutter 入门与实战(九十四):让你的组件拥有三维动效
  • Examples of AnimatedBuilders in the Flutter apiBottomSheetExpansionTilePopupMenuProgressIndicatorRefreshIndicatorScaffoldSnackBarTabBarTextField. —— 在 Flutter 中,有很多组件使用 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 是一个Matrix4 对象,用于定义三维空间的变换操作。
  • origin 是一个坐标偏移量,实际会加入到 Matrix4 的 translation(平移)中。
  • alignment:即转变进行的参考方位。
  • child:被转换的子组件。

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

应用

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

这里其实是两个组件,通过 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();
  }
}

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

完整源码

总结

本篇介绍了 AnimatedBuilder 的概念和应用, Flutter 提供 AnimatedBuilder组件的核心理念是为了创建和管理可复用的动画效果。在使用的时候,应该将动画效果和组件构建分离,从而使得AnimatedBuilder构建的动画效果可以在需要的时候得到复用。

以上就是Flutter使用AnimatedBuilder实现动效复用的详细内容,更多关于Flutter动效复用的资料请关注编程网其它相关文章!

--结束END--

本文标题: Flutter使用AnimatedBuilder实现动效复用

本文链接: https://www.lsjlt.com/news/144898.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Flutter使用AnimatedBuilder实现动效复用
    目录前言AnimatedBuilder 介绍Transform 组件介绍应用总结前言 我们之前讲述了动画构建的两种方式,Animation 和 Animation...
    99+
    2024-04-02
  • Flutter怎么使用AnimatedBuilder实现动效复用
    这篇文章主要介绍“Flutter怎么使用AnimatedBuilder实现动效复用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Flutter怎么使用AnimatedBuilder实现动效复用”文章...
    99+
    2023-06-29
  • Flutter 利用CustomScrollView实现滑动效果
    目录CustomScrollView 简介 改造原代码 让导航栏更有趣 改造后的代码 其他效果 总结 我们在之前的文章中//www.jb51.net/article/213709.h...
    99+
    2024-04-02
  • Flutter实现心动的动画特效
    目录实现动画混入 SingleTickerProviderStateMixin创建动画抽离成小组件完整代码为了追求更好的用户体验,有时候我们需要一个类似心跳一样跳动着的控件来吸引用户...
    99+
    2024-04-02
  • Flutter使用AnimatedOpacity实现图片渐现动画
    目录前言AnimatedOpacity 简介AnimatedOpacity 应用图片渐现过渡总结前言 我们介绍了几篇 Flutter 的动画控制类,相信大家对动画也有了一定的了解,可...
    99+
    2024-04-02
  • 【Flutter】Flutter 使用 fluent_ui 实现 Windows UI
    文章目录 一、前言二、动机三、安装与配置四、自定义主题与颜色五、本地化支持六、版本信息七、使用 `fluent_ui` 搭建项目首页八、总结 当然,我们将按照你的要求分批次输出文章的正...
    99+
    2023-09-28
    flutter ui android ios 前端 原力计划
  • Flutter使用NetworkImage实现图像显示效果
    使用 NetworkImage 显示图像 在 GitHub 中,每个成员都有其头像的 URL。您的下一个改进是将该头像添加到Member课程中并在应用程序中显示这些头像。 更新Mem...
    99+
    2024-04-02
  • 怎么使用Android Flutter实现弹幕效果
    本篇内容介绍了“怎么使用Android Flutter实现弹幕效果”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!前言需求要点如下:...
    99+
    2023-07-02
  • 如何使用Flutter实现手写签名效果
    目录思路绘制流程具体实现画笔Painter总结思路 需要监听用户触摸的起始点和结束点,并记录途经点,这里我使用了StreamController将途经点从起始位置到结束位置绘制出来,...
    99+
    2022-12-24
    flutter 手写签名 flutter 签名 flutter手写签名效果
  • Flutter使用AnimatedSwitcher实现场景切换动画
    目录前言AnimatedSwitcher 介绍应用总结前言 在应用中,我们经常会遇到切换组件的场景,比如点击一个按钮后,将当前的图片为另一张图片;或者是翻转卡片,显示卡片详情。在 F...
    99+
    2024-04-02
  • Flutter怎么使用NetworkImage实现图像显示效果
    本篇内容主要讲解“Flutter怎么使用NetworkImage实现图像显示效果”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Flutter怎么使用NetworkImage实现图像显示效果”吧!...
    99+
    2023-06-30
  • Android Flutter如何实现3D动画效果
    这篇文章主要讲解了“Android Flutter如何实现3D动画效果”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Android Flutter如何实现3D动画效果”吧...
    99+
    2023-06-29
  • Swift使用transform 实现重复平移动画效果
    摘要 要实现一组重复的动画,本质上就是找到动画开始点、结束点。在动画结束的时候,触发开始点,持续这样的动作。 这里面要梳理的逻辑就是1.触发开始点和2.监听动画结束点。这两个逻辑是实...
    99+
    2024-04-02
  • Flutter Animation实现缩放和滑动动画效果
    本文实例为大家分享了Flutter Animation实现缩放和滑动动画的具体代码,供大家参考,具体内容如下 Animation对象是Flutter动画库中的一个核心类,它生成指导动...
    99+
    2024-04-02
  • Flutter在项目中使用动画不使用包实现详解
    目录前言正文1 按下按钮柔软的感觉2 想要一个像 Instagram 一样的喜欢按钮吗?3 动画页面过渡4 动画文字5 更改/闪动文本样式前言 动画对于 web 和移动应用程序都非常...
    99+
    2022-11-21
    Flutter项目动画使用 Flutter 动画
  • Flutter中怎么使用AnimatedOpacity实现图片渐现动画
    今天小编给大家分享一下Flutter中怎么使用AnimatedOpacity实现图片渐现动画的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起...
    99+
    2023-06-29
  • Flutter实现Android滚动悬浮效果过程
    目录1、计算每个区块的高度2、实现分析-tabBar透明度渐变3、实现分析-app上下滚动触发tabBar4、实现分析-tabBar切换触发app滚动5、源码有以下几种效果 1、ta...
    99+
    2023-01-29
    Flutter滚动悬浮 Flutter滚动悬浮效果
  • Flutter利用SizeTransition实现组件飞入效果
    目录前言SizeTransition 介绍应用使用 SizeTransition 实现其他动画效果总结前言 继续 Transition 系列动...
    99+
    2024-04-02
  • Swift如何使用transform实现重复平移动画效果
    这篇文章主要讲解了“Swift如何使用transform实现重复平移动画效果”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Swift如何使用transform实现重复平移动画效果”吧!摘要要...
    99+
    2023-06-20
  • 怎么使用Flutter StrikeThroughTextAnimation实现文字中划线动画
    这篇文章主要介绍“怎么使用Flutter StrikeThroughTextAnimation实现文字中划线动画”,在日常操作中,相信很多人在怎么使用Flutter StrikeThroughTextAnimation实现文字中划线动画问题...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作