Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
颤振:从当前对象位置重新启动SlideAnimation_Animation_Dart_Flutter - Fatal编程技术网

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

颤振:从当前对象位置重新启动SlideAnimation,animation,dart,flutter,Animation,Dart,Flutter,我在一个对象上有一个SlideAnimation,每次点击屏幕都会被触发。对象只是向上滑动,但当我再次点击屏幕时,动画再次从对象的原始位置开始。如何捕捉对象在上一个动画中结束的位置并从此处开始执行动画? 我有以下创建SlideTransition的代码: new SlideTransition( child: new Container( child: char, ), position: _ch

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

        new SlideTransition(
          child: new Container(
            child: char,
          ),
          position: _characterPosition,
        )
下面是实际动画的代码:

_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,
  )
);

在最简单的情况下,您可以使用
\u characterAnimationController
。有两个相关的方法和步骤。验证当前动画的状态并调用所需的方法:

void _onTap() {
    if (_characterAnimationController.isAnimating) {
      _characterAnimationController.stop(canceled: false);
    } else {
      _characterAnimationController.forward();
    }
}
要在完成后扩展动画,您可以通过
值(或创建新值)重置
\u characterAnimationController
状态并更新位置。完整示例:

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,
      ));
}
class Home扩展StatefulWidget{
@凌驾
State createState()=>new_HomeState();
}
类_HomeState使用TickerProviderStateMixin扩展状态{
动画角色位置;
AnimationController _characterAnimationController;
分馏偏移量_beginOffset;
分数偏移_内偏移;
分数偏移_动画偏移;
void _restartAnimation(){
_characterAnimationController.value=0.0;
_开始偏移=_结束偏移;
_endOffset=_endOffset+_animationOffset;
设置状态(){
_characterPosition=_generateCharacterPosition();
});
_characterAnimationController.forward();
}
@凌驾
void initState(){
_animationOffset=常量分数偏移(0.0,0.15);
_beginOffset=常量分数偏移(0.0,0.0);
_endOffset=_animationOffset;
_characterAnimationController=新建AnimationController(
持续时间:新的持续时间(秒:5),vsync:this;
_characterPosition=_generateCharacterPosition();
}
@凌驾
小部件构建(构建上下文){
退回新材料(
孩子:新墨水井(
子:新幻灯片转换(
子容器:新容器(
孩子:新文本(“你好”),
),
位置:_字符位置,
),
onTap:_onTap,
),
);
}
void_onTap(){
if(_characterAnimationController.isAnimating){
_characterAnimationController.stop(取消:false);
}否则如果(_characterAnimationController.status==
动画状态(已完成){
_重启();
}否则{
_characterAnimationController.forward();
}
}
动画_generateCharacterPosition()=>新的分数LoffSetTween(
开始:_beginOffset,
结束:_endOffset,
)
.动画(新曲线动画)(
父项:_characterAnimationController,
曲线:Curves.easeOut,
));
}

当动画尚未完成时,此选项适用于。但一旦完成并再次点击屏幕,动画将再次从原始位置开始。还有其他想法吗?动画完成并再次点击后,您想要什么行为?你能举一些例子吗?当然,也许我的解释不够好,但我不好:我希望能够开始一个动画,一旦它停止(因为它停止或它完成),我想用动画再次偏移对象,但从它刚动画到的新位置。更新了答案,简单的例子是“可扩展”动画这对你有用吗?不幸的是,这让我的角色离开了银幕。但我想我了解你的方法,所以我会尝试在这个基础上进一步发展,并让你知道!