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提供支持。

相关推荐
lang201509285 小时前
JSR-340 :高性能Web开发新标准
java·前端·servlet
好家伙VCC6 小时前
### WebRTC技术:实时通信的革新与实现####webRTC(Web Real-TimeComm
java·前端·python·webrtc
未来之窗软件服务6 小时前
未来之窗昭和仙君(六十五)Vue与跨地区多部门开发—东方仙盟练气
前端·javascript·vue.js·仙盟创梦ide·东方仙盟·昭和仙君
嘿起屁儿整6 小时前
面试点(网络层面)
前端·网络
VT.馒头7 小时前
【力扣】2721. 并行执行异步函数
前端·javascript·算法·leetcode·typescript
phltxy8 小时前
Vue 核心特性实战指南:指令、样式绑定、计算属性与侦听器
前端·javascript·vue.js
Byron07079 小时前
Vue 中使用 Tiptap 富文本编辑器的完整指南
前端·javascript·vue.js
css趣多多9 小时前
地图快速上手
前端
zhengfei6119 小时前
面向攻击性安全专业人员的一体化浏览器扩展程序[特殊字符]
前端·chrome·safari
程序员老刘·9 小时前
Android Studio Otter 3 发布:日常开发选AS还是Cursor?
flutter·android studio·ai编程·跨平台开发·客户端开发