Flutter动画(二)内建隐式动画Widget

动画效果介绍中给出了选择动画的决策树:

使用动画框架不在我们讨论的话题内。flutter支持的动画包括隐式动画和显式动画。

隐式动画和显式动画

隐式动画显示动画是两种不同的动画实现方式,它们的主要区别在于控制权和动画的重复性。

隐式动画:

  • 自动完成:隐式动画是由系统框架自动完成的,不需要用户手动控制动画过程。
  • 单向且一次性的:隐式动画是一次性的,单方向的,由某个属性值的变化驱动,例如透明度从0到1的变化。
  • 无法自动重复:隐式动画无法实现动画效果从0到1再到0的自动重复。
  • 无法停止:一旦隐式动画开始,就无法中途停止,直到动画完成。
  • 简单易用:隐式动画只能控制duration和curve,不需要创建控制器,只需几行代码就可实现简单的动画效果。

显示动画:

  • 用户控制:显示动画需要用户自己通过AnimationController创建的动画。
  • 灵活且复杂:显示动画可以随时控制动画的开始和暂停,并且可以实现循环的,交错的变化效果。
  • 定义完整流程:显示动画不像隐式动画那样默认从一个初始状态线性变化到目标状态,而是需要显式地定义完整的动画流程。
  • 更灵活:显示动画可以更加灵活地实现更加复杂的动画效果,例如在x和y轴方向上不断缩放的动画对象。

需要注意的是,使用隐式动画后,View会暂时不能接收用户的触摸、滑动等手势,这可能会导致在列表滚动时,如果对其中的view使用了隐式动画,滚动无法主动停止下来,必须等动画结束了才能停止。

flutter既提供了内置的隐式和显式动画相关widget,也提供了相关自定义的widget。

内建隐式动画Widget

本篇介绍flutter内建的隐式动画Widget。常见的内建隐式动画Widget:

AnimatedAlign

AnimatedContainer

AnimatedDefaultTextStyle

AnimatedFractionallySizedBox

AnimatedScale

AnimatedRotation

AnimatedSlide

AnimatedOpacity、SliverAnimatedOpacity

AnimatedPadding

AnimatedPhysicalModel

AnimatedPositioned

AnimatedPositionedDirectional

AnimatedTheme

AnimatedCrossFade

AnimatedSize

AnimatedSwitcher

TweenAnimationBuilder

AnimatedSwitcher

9.6 动画切换组件(AnimatedSwitcher) | 《Flutter实战·第二版》

AnimatedCrossFade

AnimatedSwitcher不同的是,AnimatedCrossFade是针对两个子元素,而AnimatedSwitcher是在一个子元素的新旧值之间切换。

TweenAnimationBuilder

TweenAnimationBuilder可以用于实现自定义的隐式动画。TweenAnimationBuilder用法比较简单,首先需要一个动画时长参数:

Dart 复制代码
TweenAnimationBuilder<double>(
	duration: Duration(seconds: 2),
)

可以设置tween(动画的值),比如需要一个100到200的差值:

Dart 复制代码
tween: Tween<double>(begin: 100.0, end: 200),

如果需要颜色值使用ColorTween,这样我们的动画组件就可以动起来了。

我们也可以设置动画曲线,设置如下:

Dart 复制代码
TweenAnimationBuilder<double>(
	 curve: Curves.bounceIn,
)

通过onEnd监听动画完成通知,用法如下:

Dart 复制代码
TweenAnimationBuilder<double>(
	 onEnd: () {}
)

然后添加一个builder方法来提供widget消费动画值,用法如下:

Dart 复制代码
builder: (context, value, child) {
        return Container(
          height: value,
          width: value,
          child: child,
        );
      }

builder方法有3个参数,第一个是BuildContext,第二个value的类型取决于你要做动画的数据,比如:

Dart 复制代码
TweenAnimationBuilder<double>(
	builder: (context, value, child) {
	}
)

value的类型就是double,如果是TweenAnimationBuilder<Color>,value的类型就是Color。

第三个就是TweenAnimationBuilder的子组件,用于优化。这种优化在flutter中很常见,避免了子组件中不变的部分被反复创建。

相关推荐
西西学代码10 小时前
Flutter---回调函数
开发语言·javascript·flutter
圣光SG11 小时前
Vue.js 从入门到精通:技术成长之路
flutter
恋猫de小郭19 小时前
Swift 6.3 正式发布支持 Android ,它能在跨平台发挥什么优势?
android·前端·flutter
i-阿松!1 天前
PCB板子+ flutter前端 + go后端
物联网·flutter·pcb工艺·go1.19
恋猫de小郭1 天前
Flutter 3.41.6 版本很重要,你大概率需要更新一下
android·前端·flutter
亚历克斯神1 天前
Flutter for OpenHarmony: Flutter 三方库 mutex 为鸿蒙异步任务提供可靠的临界资源互斥锁(并发安全基石)
android·数据库·安全·flutter·华为·harmonyos
钛态1 天前
Flutter 三方库 smartstruct 鸿蒙化字段映射适配指南:介入静态预编译引擎扫除视图及数据模型双向强转类型错乱隐患,筑稳如磐石的企业级模型治理防线-适配鸿蒙 HarmonyOS ohos
flutter·华为·harmonyos
键盘鼓手苏苏1 天前
Flutter 组件 csv2json 适配鸿蒙 HarmonyOS 实战:高性能异构数据转换,构建 CSV 流式解析与全栈式数据映射架构
flutter·harmonyos·鸿蒙·openharmony
左手厨刀右手茼蒿1 天前
Flutter 组件 http_requests 适配鸿蒙 HarmonyOS 实战:极简网络请求,构建边缘端轻量级 RESTful 通讯架构
网络·flutter·http
雷帝木木1 天前
Flutter 三方库 hrk_logging 的鸿蒙化适配指南 - 实现标准化分层日志记录、支持多目的地输出与日志分级过滤
flutter·harmonyos·鸿蒙·openharmony·hrk_logging