android - 如何在指定的持续时间后以正确的方式运行动画?

标签 android ios flutter dart

假设我在Stack小部件中有3个形状,需要从A点移动到B点。我想在指定的延迟0ms 1000ms 2000ms ..之后开始这3个动画。因此,我有3个分离的AnimationController对象,但没有看到类似delay:的构造函数参数。我试图使用循环循环运行forward方法3次

int delay = 0;
for (final AnimationController currentController in controllers) {
   Future.delayed(Duration(milliseconds: delay), () {
       currentController.forward(from: value);
    });
   delay += 1000;
}

要么
await Future.delayed(Duration(milliseconds: delay));
currentController.forward(from: value);

或使用Timer类代替Future,但无法正常工作。在前台工作正常,但是当我将应用程序移动到背景并返回到前台时,每个形状之间的间隙消失,并且它们处于相同的位置,并像一个形状一样移动。

最佳答案

您可以制作一个有状态的小部件,如下所示。根据需要更改动画。

class SlideUpWithFadeIn extends StatefulWidget {
  final Widget child;
  final int delay;
  final Curve curve;

  SlideUpWithFadeIn({@required this.child, @required this.curve, this.delay});

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

class _SlideUpWithFadeInState extends State<SlideUpWithFadeIn>
    with TickerProviderStateMixin {
  AnimationController _animController;
  Animation<Offset> _animOffset;

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

    _animController =
        AnimationController(vsync: this, duration: Duration(milliseconds: 1250));
    final curve =
        CurvedAnimation(curve: widget.curve, parent: _animController);
    _animOffset =
        Tween<Offset>(begin: const Offset(0.0, 0.75), end: Offset.zero)
            .animate(curve);

    if (widget.delay == null) {
      _animController.forward();
    } else {
      Timer(Duration(milliseconds: widget.delay), () {
        _animController.forward();
      });
    }
  }

  @override
  void dispose() {
    _animController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return FadeTransition(
      child: SlideTransition(
        position: _animOffset,
        child: widget.child,
      ),
      opacity: _animController,
    );
  }
}

并像这样使用
SlideUpWithFadeIn(
   child: ...,
   delay: 0,
   curve: ...,
),
SlideUpWithFadeIn(
   child: ...,
   delay: 1000,
   curve: ...,
),
SlideUpWithFadeIn(
   child: ...,
   delay: 2000,
   curve: ...,
),

关于android - 如何在指定的持续时间后以正确的方式运行动画?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61163307/

相关文章:

flutter - 我如何将 Gradient 与 Flutter ThemeData backgroundColor 属性一起使用?

android - 当 Flutter 抽屉里面有 Dismissible 时,如何让它关闭?

webview - 在flutter webview中禁用水平滚动

android - getChildFragmentManager()无法解析或无法引用

Android 错误在夜间模式下加载错误的颜色

ios - 使用 swift3 为 xib 文件中的按钮提供操作

删除文件后 iOS 仍然可以引用文件

android - 在 Google Maps Android 上绘制路线

android - 如何删除 HTML5 输入类型时间的秒数

ios - 如果从另一个类调用 removeFromSuperview 则不起作用