当前位置: 首页 > 工具软件 > Tween > 使用案例 >

Flutter tween动画

沈子实
2023-12-01

需求:做一个图标放大动画

1:创建 StateFulWidget、 State, Tween动画的创建需要  begin end渐变值,以及一个控制器,

如下:

  //动画控制器  duration 播放时长 vsync 同步,State 需要实现 SingleTickerProviderStateMixin
    animationController =
        AnimationController(duration: Duration(seconds: 2), vsync: this);
    //动画需要一个开始 结束渐变值范围 动画控制器
    animation = Tween<double>(begin: 0, end: 300).animate(animationController);

2:本次动画使用 AnimatedBuilder,接下来创建 变大动画的图标之前,我们先来实现 动画组件先,创建一个 AnimatedLogo,用于构造动画,如下:


// AnimatedBuilder 模式的tween 动画组件
class AnimatedLogo extends StatelessWidget {
  Animation<double> animation;
  Widget child;

//接受一个 动画 用于动画的 widget
  AnimatedLogo({this.animation, this.child});

//创建 AnimatedBuilder 设置传入的 动画 组件
  @override
  Widget build(BuildContext context) => AnimatedBuilder(
        animation: animation,
        child: child,
        builder: (context, child) =>
            //创建一个容器 包裹 " 用于动画的 widget",根据动画渐变值 改变其大小
            Container(
          child: child,
          height: animation.value,
          width: animation.value,
        ),
      );
}

3: 回到 StateFulWidget,设置body,引入 AnimatedLogo,设置 第一个步骤时候创建的animation,这里的child我们直接使用FLutterLogo(ps:想设置什么都可以,例如Icon(Icons.xx)),如下:
 

//设置动画组件  animation: 执行的动画 child:需要做动画的 widget
        body: AnimatedLogo(
          animation: animation,
          child: FlutterLogo(),
        ));

全文如下:

import 'dart:ffi';

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';

class AnimBuildDart extends StatefulWidget {
  const AnimBuildDart({Key key}) : super(key: key);

  @override
  _AnimActionDartState createState() => _AnimActionDartState();
}

class _AnimActionDartState extends State<AnimBuildDart>
    with SingleTickerProviderStateMixin {
  AnimationController animationController;
  AnimationStatus status;
  Animation animation;

  @override
  void initState() {
    //初始化
    super.initState();
    //动画控制器  duration 播放时长 vsync 同步,State 需要实现 SingleTickerProviderStateMixin
    animationController =
        AnimationController(duration: Duration(seconds: 2), vsync: this);
    //动画需要一个开始 结束渐变值范围 动画控制器
    animation = Tween<double>(begin: 0, end: 300).animate(animationController);
    animationController.forward();
  }

  @override
  void didChangeDependencies() {
    //   改变
    super.didChangeDependencies();
  }

  @override
  Widget build(BuildContext context) {
    //改变 构造
    return Scaffold(
        appBar: AppBar(
          title: Text("tween"),
          leading: GestureDetector(
            child: Icon(Icons.arrow_back),
            onTap: () {
              Navigator.pop(context);
            },
          ),
        ),
        //设置动画组件  animation: 执行的动画 child:需要做动画的 widget
        body: AnimatedLogo(
          animation: animation,
          child: FlutterLogo(),
        ));
  }

  @override
  void didUpdateWidget(AnimBuildDart oldWidget) {
    //重绘
    super.didUpdateWidget(oldWidget);
  }

  @override
  void deactivate() {
    // 销毁
    super.deactivate();
  }

  @override
  void dispose() {
    //移除
    super.dispose();
    animationController.dispose();
  }
}

// AnimatedBuilder 模式的tween 动画组件
class AnimatedLogo extends StatelessWidget {
  Animation<double> animation;
  Widget child;

//接受一个 动画 用于动画的 widget
  AnimatedLogo({this.animation, this.child});

//创建 AnimatedBuilder 设置传入的 动画 组件
  @override
  Widget build(BuildContext context) => AnimatedBuilder(
        animation: animation,
        child: child,
        builder: (context, child) =>
            //创建一个容器 包裹 " 用于动画的 widget",根据动画渐变值 改变其大小
            Container(
          child: child,
          height: animation.value,
          width: animation.value,
        ),
      );
}

 类似资料: