当前位置: 首页 > news >正文

flutter开发实战-TweenSequence实现动画序列

flutter开发实战-TweenSequence实现动画序列

一、TweenSequence

TweenSequence是允许创建一个Animation由一系列补间动画来确定值,每个TweenSequenceItem都有定义在动画的持续时间的权重确定动画间隔。

  • TweenSequence 动画组类
  • TweenSequenceItem 用来定义每一个动画的具体实现的类

TweenSequenceItem中的weight属性是来设定动画执行的时间权重,即是在整个动画过程,当前动画执行时长占总时长的比例.

如一个动画差值占的时间比例为weight2/(weight1+weight2)

二、TweenSequence实现动画序列

声明动画控制器AnimationController 和 动画Animation。
通过TweenSequence实现动画序列

示例代码如下

class TweenSequencePage extends StatefulWidget {
  const TweenSequencePage({super.key});

  @override
  State<TweenSequencePage> createState() => _TweenSequencePageState();
}

class _TweenSequencePageState extends State<TweenSequencePage>
    with TickerProviderStateMixin {
  AnimationController? _animationController;
  Animation<double>? _animation;

  @override
  void initState() {
    super.initState();
    _animationController = AnimationController(
        duration: Duration(milliseconds: 1000), vsync: this);
    TweenSequenceItem<double> downMarginItem = TweenSequenceItem<double>(
        tween: Tween(begin: 1.0, end: 300.0), weight: 5);
    TweenSequenceItem<double> upMarginItem = TweenSequenceItem<double>(
      tween: Tween(begin: 300.0, end: 50.0),
      weight: 4,
    );
    TweenSequenceItem<double> downMarginItem2 = TweenSequenceItem<double>(
      tween: Tween(begin: 50.0, end: 200.0),
      weight: 3,
    );
    TweenSequenceItem<double> upMarginItem2 = TweenSequenceItem<double>(
      tween: Tween(begin: 200.0, end: 100.0),
      weight: 2,
    );
    TweenSequenceItem<double> endMarginItem = TweenSequenceItem<double>(
      tween: Tween(begin: 100.0, end: 50.0),
      weight: 1,
    );
    TweenSequence<double> tweenSequence = TweenSequence<double>([
      downMarginItem,
      upMarginItem,
      downMarginItem2,
      upMarginItem2,
      endMarginItem,
    ]);
    _animation = tweenSequence.animate(_animationController!);
    _animation!.addListener(() {
      setState(() {});
    });

    _animation!.addStatusListener((status) {
      print("TweenSequence status:${status}");
      if (status == AnimationStatus.completed) {
        ///正向执行完毕后立刻反向执行(倒回去)
        _animationController?.reverse();
      } else if (status == AnimationStatus.dismissed) {
        ///无次数限定执行
        _animationController?.forward();
      }
    });
  }

  void startEasyAnimation() {
    _animationController?.forward();
  }

  @override
  void dispose() {
    _animationController?.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('TweenSequencePage'),
      ),
      body: Stack(alignment: Alignment.center, children: [
        Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Container(
              width: 200,
              height: 50,
              color: Colors.blue,
              margin: EdgeInsets.only(top: _animation?.value ?? 0),
            ),
          ],
        ),
        Positioned(
          bottom: 20,
          child: OutlinedButton(
            onPressed: startEasyAnimation,
            child: Text(
              "点击执行动画",
              style: TextStyle(color: Colors.black38),
            ),
          ),
        ),
      ]),
    );
  }
}
    

三、小结

flutter开发实战-TweenSequence实现动画序列

学习记录,每天不停进步。

相关文章:

  • 单通道低压 H 桥电机驱动芯片AT9110H 兼容L9110 马达驱动芯片
  • 达梦数据库答案
  • 勒索病毒最新变种.halo勒索病毒来袭,如何恢复受感染的数据?
  • SwissArmyTransformer瑞士军刀工具箱使用手册
  • 微服务之Eureka
  • 硬件知识1
  • 零代码编程:用ChatGPT批量提取flash动画swf文件中的mp3
  • React:实现一个定时器计数器,每秒自动+1
  • 大语言模型比武
  • 初步了解OSG智能指针
  • 传感器融合是什么?及其类型和应用
  • react typescript @别名的使用
  • Django框架的推导
  • AI 绘画 | Stable Diffusion 高清修复、细节优化
  • ArcGIS属性表导出时中文为乱码的解决办法
  • Microsoft Dynamics 365 CE 扩展定制 - 7. 安全
  • 远程运维用什么软件?可以保障更安全?
  • 如何选择SVM中最佳的【核函数】
  • ffmpeg的使用
  • 【Web】在前端中,HTML<meta>标签
  • 女巫的继承者们
  • 聘期三年已至:37岁香港青年叶家麟卸任三亚市旅游发展局局长
  • 中国旅游日|上天当个“显眼包”!体验低空经济的“飞”凡魅力
  • 新城市志|GDP万亿城市,一季度如何挑大梁
  • 流失海外79年,两卷战国帛书回归祖国
  • 以军称已开始在加沙的新一轮大规模攻势