Flutter 动画系列 -- Tween

Tween

Tween 是一个在两个值之间进行插值的类,俗称补间动画。这些值可以是不同的数据类型,例如双精度型、颜色型或矩形型等。当具有系统的Tween类与子类不直接支持的独特数据类型或复杂动画时,我们也可以自定义 Tween 类来实现。

注意: Tween 是"in- Between"的缩写,用于指代关键帧之间存在的帧。这些框架有助于创造两种最终状态之间过渡的错觉。

Tween是一个无状态对象,它根据指定的起点、终点和循环duration生成一组新值 。

下面给出的是定义 的语法Tween

ini 复制代码
 Tween doubleTween = Tween<double>(begin: 0, end: 10); 
 value = doubleTween.transform(0.5);

doubleTween 是一个 对象,表示从 010Tween 值 。 调用transform() 方法并将值设置为 0.5。它决定了一个动画周期的时间段。 Tween 动画主要与 AnimationController 一起使用,有助于向前或向后播放动画。 AnimationController 取一个 duration 值,该值确定完成一个动画周期的时间。

SizeTween

基于Size的过渡变化。

less 复制代码
 AnimationController  controller = AnimationController(duration: const Duration(seconds: 2), vsync: this,)..repeat(reverse: true);
 Tween sizeTween = new SizeTween(begin: Size(0.0,0.0),end: Size(200.0,200.0));     
 Animation<Size> sizeAnimation = sizeTween.animate(_controller); 
 Container(width: sizeAnimation.value, height: sizeAnimation.value, color: Colors.red,);

ColorTween

基于Color的颜色渐变。

php 复制代码
  AnimationController   controller = AnimationController(duration: const Duration(seconds: 2), vsync: this,)..repeat(reverse: true);
  Tween colorTween = ColorTween(begin: Colors.red, end: Colors.purple,)
  Animation<double>  colorAnimation = colorTween.animate(controller);
  Container(width: 200, height: 200, color: colorAnimation.value,);

RectTween

基于坐标的渐变, 表示起始坐标和结束坐标以及对象的位置。

less 复制代码
  AnimationController controller = AnimationController(duration: const Duration(seconds: 5), vsync: this,)..repeat();
  Tween reactTween = RectTween(begin: Rect.fromLTWH(0, 0, 100, 100), end: Rect.fromLTWH(450, 200, 100, 100),);
  Animation<Rect>  rectAnimation = .animate(controller);
  Positioned.fromRect(rect: rectAnimation.value, child: Container(color: Colors.red,),);

注意事项:使用的时候需要使用需要用AnimatedBuilder作为父组件

php 复制代码
 AnimatedBuilder(animation: controller, builder: (context, child) {
    return xxxxx;
 },),

....

自定义Tween

要创建自定义Tween ,您需要扩展Tween 类并覆盖lerp (线性插值)函数。lerp函数定义了动画持续时间内开始值和结束值之间发生插值的方式。这是一个简短的指南:

  • 定义数据类型:确定要插值的值的类型。这可能是自定义类或更复杂的结构。
  • 扩展 Tween 类:创建一个扩展 Tween 的新类,其中 T 是您的数据类型。
  • 覆盖 Lerp 函数:实现 lerp 函数以在开始值和结束值之间进行插值。该函数接收一个双精度t,表示当前的线性插值因子,一般在0.0到1.0之间。
  • 使用补间:将自定义补间应用于动画控制器,以随着时间的推移对属性进行动画处理。

例如:慢慢地使蓝色方块出现在屏幕上

scala 复制代码
import 'package:flutter/material.dart';  
  
class DoubleTween extends Tween<double> {  
DoubleTween({double begin = 0.0, double end = 1.0}) : super(begin: begin, end: end);  
@override  
double lerp(double t) {  
   return begin! + (end! - begin!) * t;  
}}  
  
class CustomTweenAnimationWidget extends StatefulWidget {  
@override  
_CustomTweenAnimationWidgetState createState() => _CustomTweenAnimationWidgetState();  
}  
  
class _CustomTweenAnimationWidgetState extends State<CustomTweenAnimationWidget> with SingleTickerProviderStateMixin {  
late AnimationController _controller;  
late Animation<double> _animation;  
  
@override  
void initState() {  
super.initState();  
_controller = AnimationController(vsync: this, duration: const Duration(seconds: 2));  
_animation = DoubleTween(begin: 0.0, end: 1.0).animate(_controller)  
..addListener(() {  
setState(() {});  
});  
_controller.forward();  
}  
  
@override  
void dispose() {  
_controller.dispose();  
super.dispose();  
}  
  
@override  
Widget build(BuildContext context) {  
return Opacity(  
opacity: _animation.value,  
child: Container(  
width: 200,  
height: 200,  
color: Colors.blue,  
),  );  }  }

TweenAnimationBuilder

dart 复制代码
const TweenAnimationBuilder({
    Key? key,
    required this.tween,
    required Duration duration,
    Curve curve = Curves.linear,
    required this.builder,
    VoidCallback? onEnd,
    this.child,
  })

TweenAnimationBuilder参数:

  • Tween :如果补间是 double 类型,那么它会从Tween.beginTween.end进行动画处理
  • Duration:Duration是动画运行的设定时间
  • Builder: Builder 帮助我们构建需要使用动画构建的内容。

TweenAnimationBuilder与ImplicitlyAnimatedWidgetAnimatedWidget的关系

ImplicitlyAnimatedWidget有许多子类,它们提供常规小部件的动画版本。这些子类(如AnimatedOpacityAnimatedContainerAnimatedSize等)可以平滑地对其属性进行动画更改,并且它们比这个通用构建器更易于使用。TweenAnimationBuilder(它本身也是 ImplicitlyAnimatedWidget的子类)也可以方便地将任何小部件属性动画化为给定的目标值,即使框架(或第三方小部件库)未附带该小部件的动画版本。

ImplicitlyAnimatedWidget(包括这个TweenAnimationBuilder)内部还都管理一个AnimationController来驱动动画。如果您想要对动画进行更多控制,而不仅仅是设置目标值、 持续时间曲线,更多的请查看AnimatedWidgetAnimatedWidget的一个示例是 AnimatedBuilder,它的使用方式与 TweenAnimationBuilder类似,但与后者不同的是,它由自己创建并管理的AnimationController提供支持。

相关推荐
军军君017 分钟前
Three.js基础功能学习十六:智能黑板实现实例三
前端·javascript·css·vue.js·3d·前端框架·threejs
AI_零食10 分钟前
开源鸿蒙跨平台Flutter开发:脑筋急转弯应用开发文档
flutter·华为·开源·harmonyos·鸿蒙
海上彼尚12 分钟前
SVG矢量图形快速入门
前端·html5
嗷o嗷o19 分钟前
Android App Functions 深入理解
前端
UXbot26 分钟前
AI原型设计工具评测:从创意到交互式Demo,5款产品全面解析
前端·ui·设计模式·ai·ai编程·原型模式
落魄江湖行27 分钟前
硅基同事埋的坑,我用2小时才填平:Nuxt 4 路由踩坑:可选参数 [[id]] 与 [id] 的区别
前端
一勺菠萝丶33 分钟前
管理后台使用手册在线预览与首次登录引导弹窗实现
java·前端·数据库
军军君0134 分钟前
Three.js基础功能学习十四:智能黑板实现实例一
前端·javascript·css·typescript·前端框架·threejs·智能黑板
小村儿36 分钟前
连载05-Claude Skill 不是抄模板:真正管用的 Skill,都是从实战里提炼出来的
前端·后端·ai编程
xiaotao13142 分钟前
JS new 操作符完整执行过程
开发语言·前端·javascript·原型模式