Flutter:从当前对象位置重新启动 SlideAnimation

Bra*_*sen 2 animation dart flutter

SlideAnimation每次点击屏幕时都会触发一个对象。对象只是向上滑动,但是当我再次点击屏幕时,动画再次从对象的原始位置开始。我将如何捕获对象在最后一个动画中结束的位置并从那里开始执行动画?
我有以下用于创建 SlideTransition 的代码:

        new SlideTransition(
          child: new Container(
            child: char,
          ),
          position: _characterPosition,
        )
Run Code Online (Sandbox Code Playgroud)

这段代码用于实际动画:

_characterPosition = new FractionalOffsetTween(
  begin: const FractionalOffset(0.0, 0.0),
  end: const FractionalOffset(0.0, -0.2),
).animate(new CurvedAnimation(
  parent: _characterAnimationController,
  curve: Curves.easeOut,
  )
);
Run Code Online (Sandbox Code Playgroud)

Ger*_*kin 7

在最简单的情况下,您可以使用您的_characterAnimationController. AnimationController有两个相关的方法stopforward。验证当前动画的状态并调用所需的方法:

void _onTap() {
    if (_characterAnimationController.isAnimating) {
      _characterAnimationController.stop(canceled: false);
    } else {
      _characterAnimationController.forward();
    }
}
Run Code Online (Sandbox Code Playgroud)

要在完成后扩展动画,您可以_characterAnimationController通过value(或创建新的)和更新位置重置状态。完整示例:

class Home extends StatefulWidget {
  @override
  State createState() => new _HomeState();
}

class _HomeState extends State<Home> with TickerProviderStateMixin {
  Animation _characterPosition;
  AnimationController _characterAnimationController;
  FractionalOffset _beginOffset;
  FractionalOffset _endOffset;
  FractionalOffset _animationOffset;

  void _restartAnimation() {
    _characterAnimationController.value = 0.0;
    _beginOffset = _endOffset;
    _endOffset = _endOffset + _animationOffset;

    setState(() {
      _characterPosition = _generateCharacterPosition();
    });

    _characterAnimationController.forward();
  }

  @override
  void initState() {
    _animationOffset = const FractionalOffset(0.0, 0.15);
    _beginOffset = const FractionalOffset(0.0, 0.0);
    _endOffset = _animationOffset;

    _characterAnimationController = new AnimationController(
        duration: new Duration(seconds: 5), vsync: this);
    _characterPosition = _generateCharacterPosition();
  }

  @override
  Widget build(BuildContext context) {
    return new Material(
      child: new InkWell(
        child: new SlideTransition(
          child: new Container(
            child: new Text("Hello"),
          ),
          position: _characterPosition,
        ),
        onTap: _onTap,
      ),
    );
  }

  void _onTap() {
    if (_characterAnimationController.isAnimating) {
      _characterAnimationController.stop(canceled: false);
    } else if (_characterAnimationController.status ==
        AnimationStatus.completed) {
      _restartAnimation();
    } else {
      _characterAnimationController.forward();
    }
  }

  Animation _generateCharacterPosition() => new FractionalOffsetTween(
        begin: _beginOffset,
        end: _endOffset,
      )
          .animate(new CurvedAnimation(
        parent: _characterAnimationController,
        curve: Curves.easeOut,
      ));
}
Run Code Online (Sandbox Code Playgroud)