链接可在相同属性上运行的单独动画

时间:2019-07-05 10:16:07

标签: flutter flutter-animation

我看过Staggered animations来链接动画,但是在那里他们将一个动画用于一个小部件的属性,例如一个不透明的动画控制着淡入,但是如果我想先淡入然后再淡出相同的小部件怎么办?我的意思是我已经创建了淡入淡出的动画,并用于小部件的不透明度值,如下所示:

_opacityDontWorry = Tween(
  begin: 0.0,
  end: 1.0,
).animate(
  CurvedAnimation(parent: _animationController, curve: Interval(0.0, 0.75, curve: Curves.easeIn)),
);

所以这两个现在像这样绑定在一起:

Opacity(
  opacity: _opacityDontWorry.value,
  child: Text("Don't worry"),
)

这项工作正常,我的不透明度逐渐淡入,但是淡入后我希望它在短暂的停顿后淡出,但是我该怎么做呢?是否创建新的Tween并用它覆盖_opacityDontWorry?我什至在正确的路径上,如何链接改变小部件上相同属性的多个动画?

谢谢
索伦

2 个答案:

答案 0 :(得分:1)

您可以在addStatusListener上使用Animation。检查动画何时完成,然后在reverse()上调用AnimationController

如果需要,可以在reverse()内调用Future.delayed()进行暂停。

我为您制作了此示例:

import 'package:flutter/material.dart';

class HomePage extends StatefulWidget {
  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> with TickerProviderStateMixin {
  AnimationController _animationController;
  Animation _opacityDontWorry;

  @override
  void initState() {
    super.initState();

    _animationController = AnimationController(duration: Duration(seconds: 1), vsync: this);
    _opacityDontWorry = Tween(
      begin: 0.0,
      end: 1.0,
    ).animate(
      CurvedAnimation(parent: _animationController, curve: Curves.easeIn),
    )..addStatusListener((status) {
      if (status == AnimationStatus.completed) {
        Future.delayed(Duration(seconds: 3), () {
          _animationController.reverse();
        });
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      floatingActionButton: FloatingActionButton.extended(
        label: Text('Animate'),
        onPressed: () => _animationController.forward(),
      ),
      body: Center(
        child: AnimatedBuilder(
          animation: _opacityDontWorry,
          builder: (context, widget) {
            return Opacity(
              opacity: _opacityDontWorry.value,
              child: Text("Don't worry"),
            );
          },
        ),
      ),
    );
  }
}

更新

如果需要播放此动画,然后再调用另一个动画,则可以将不透明度值提取到变量中。然后根据需要从多个连续动画中更新该值。

  _firstAnimation = Tween(
    begin: 0.0,
    end: 1.0,
  ).animate(
    CurvedAnimation(parent: _animationController, curve: Interval(0.0, 0.20, curve: Curves.easeIn)),
  )..addListener(() {
      setState(() => _opacity = _firstAnimation.value);
    });

  // Leave an interval pause if you need
  _secondAnimation = Tween(
    begin: 1.0,
    end: 0.0,
  ).animate(
    CurvedAnimation(parent: _animationController, curve: Interval(0.40, 0.60, curve: Curves.easeIn)),
  )..addListener(() {
      setState(() => _opacity = _secondAnimation.value);
    });

在小部件的不透明度属性中,不要使用_firstAnimation.value,而要使用_opacity

答案 1 :(得分:0)

可能这是一个较晚的答案。但是,TweenSequence是正确的类,可以为一个或多个相同的属性设置动画。 Docs reference