Flutter FadeIn/FadeOut 动画一起

Dol*_*rma 4 flutter flutter-animation

在这个简单的示例代码中,我想将淡入淡出和淡出动画放在一起,但在此代码中,淡入淡出只能工作而reverse不能工作,我怎么能同时拥有它们?

import 'package:flutter/material.dart';

void main()=>runApp(MaterialApp(home: FadeTransitionSample(),));
class FadeTransitionSample extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => _Fade();
}

class _Fade extends State<FadeTransitionSample> with TickerProviderStateMixin {
  AnimationController animation;
  Animation<double> _fadeInFadeOut;

  @override
  void initState() {
    super.initState();
    animation = AnimationController(vsync: this, duration: Duration(seconds: 3),);
    _fadeInFadeOut = Tween<double>(begin: 0.0, end: 0.1).animate(animation);

    animation.addListener((){
      if(animation.isCompleted){
        animation.reverse();
      }else{
        animation.forward();
      }
    });
    animation.repeat();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Container(
        child: Center(
          child: FadeTransition(
            opacity: animation,
            child: Container(
              color: Colors.green,
              width: 100,
              height: 100,
            ),
          ),
        ),
      ),
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

bar*_*waj 14

好吧,我假设您希望在容器上获得淡入淡出动画。

有几件事你需要改变。

  1. FadeTransition类不应该采取的animation不透明度,而应该是_fadeInFadeOut可变
  2. 动画开始,当你调用animation.forward()而不是animation.repeat()(因为在你的情况下,你还需要反转动画,总是从 animation.forward() 调用开始)。

确保使用该addStatusListener()方法而不是addListener()因为您可以更好地控制您的状态。

所以,所有这些放在一起,下面是使您的动画工作的工作代码。

import 'package:flutter/material.dart';

void main()=>runApp(MaterialApp(home: FadeTransitionSample(),));
class FadeTransitionSample extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => _Fade();
}

class _Fade extends State<FadeTransitionSample> with TickerProviderStateMixin {
  AnimationController animation;
  Animation<double> _fadeInFadeOut;

  @override
  void initState() {
    super.initState();
    animation = AnimationController(vsync: this, duration: Duration(seconds: 3),);
    _fadeInFadeOut = Tween<double>(begin: 0.0, end: 0.5).animate(animation);

    animation.addStatusListener((status){
      if(status == AnimationStatus.completed){
        animation.reverse();
      }
      else if(status == AnimationStatus.dismissed){
        animation.forward();
      }
    });
    animation.forward();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Container(
        child: Center(
          child: FadeTransition(
            opacity: _fadeInFadeOut,
            child: Container(
              color: Colors.green,
              width: 100,
              height: 100,
            ),
          ),
        ),
      ),
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 目前,淡入和淡出的延迟相同。如果您希望两个动作具有不同的持续时间,则必须创建单独的动画并使用它们。用简单的逆向方法是做不到的。您还可以利用其他调用,例如 animateTo() 和 animateBack()。 (2认同)