Ejemplo n.º 1
0
 void _updateSecondaryAnimation(Route nextRoute)
 {
     if (nextRoute is TransitionRoute && this.canTransitionTo((TransitionRoute) nextRoute) &&
         ((TransitionRoute) nextRoute).canTransitionFrom(this)) {
         Animation<float> current = this._secondaryAnimation.parent;
         if (current != null) {
             if (current is TrainHoppingAnimation) {
                 TrainHoppingAnimation newAnimation = null;
                 newAnimation = new TrainHoppingAnimation(
                     ((TrainHoppingAnimation) current).currentTrain,
                     ((TransitionRoute) nextRoute)._animation,
                     onSwitchedTrain: () => {
                         D.assert(this._secondaryAnimation.parent == newAnimation);
                         D.assert(newAnimation.currentTrain == ((TransitionRoute) nextRoute)._animation);
                         this._secondaryAnimation.parent = newAnimation.currentTrain;
                         newAnimation.dispose();
                     }
                 );
                 this._secondaryAnimation.parent = newAnimation;
                 ((TrainHoppingAnimation) current).dispose();
             }
             else {
                 this._secondaryAnimation.parent =
                     new TrainHoppingAnimation(current, ((TransitionRoute) nextRoute)._animation);
             }
         }
         else {
             this._secondaryAnimation.parent = ((TransitionRoute) nextRoute)._animation;
         }
     }
     else {
         this._secondaryAnimation.parent = Animations.kAlwaysDismissedAnimation;
     }
 }
Ejemplo n.º 2
0
        void _updateSecondaryAnimation(Route nextRoute)
        {
            VoidCallback previousTrainHoppingListenerRemover = _trainHoppingListenerRemover;

            _trainHoppingListenerRemover = null;
            if (nextRoute is TransitionRoute && canTransitionTo((TransitionRoute)nextRoute) &&
                ((TransitionRoute)nextRoute).canTransitionFrom((TransitionRoute)this))
            {
                Animation <float> current = _secondaryAnimation.parent;
                if (current != null)
                {
                    Animation <float> currentTrain = current is TrainHoppingAnimation ? ((TrainHoppingAnimation)current).currentTrain : current;
                    Animation <float> nextTrain    = ((TransitionRoute)nextRoute)._animation;
                    if (
                        currentTrain.value == nextTrain.value ||
                        nextTrain.status == AnimationStatus.completed ||
                        nextTrain.status == AnimationStatus.dismissed
                        )
                    {
                        _setSecondaryAnimation(nextTrain, ((TransitionRoute)nextRoute).completed);
                    }
                    else
                    {
                        TrainHoppingAnimation newAnimation = null;
                        void _jumpOnAnimationEnd(AnimationStatus status)
                        {
                            switch (status)
                            {
                            case AnimationStatus.completed:
                            case AnimationStatus.dismissed:
                                _setSecondaryAnimation(nextTrain, ((TransitionRoute)nextRoute).completed);
                                if (_trainHoppingListenerRemover != null)
                                {
                                    _trainHoppingListenerRemover();
                                    _trainHoppingListenerRemover = null;
                                }
                                break;

                            case AnimationStatus.forward:
                            case AnimationStatus.reverse:
                                break;
                            }
                        }

                        _trainHoppingListenerRemover = () => {
                            nextTrain.removeStatusListener(_jumpOnAnimationEnd);
                            newAnimation?.dispose();
                        };
                        nextTrain.addStatusListener(_jumpOnAnimationEnd);
                        newAnimation = new TrainHoppingAnimation(
                            currentTrain,
                            nextTrain,
                            onSwitchedTrain: () => {
                            D.assert(_secondaryAnimation.parent == newAnimation);
                            D.assert(newAnimation.currentTrain == ((TransitionRoute)nextRoute)._animation);
                            _setSecondaryAnimation(newAnimation.currentTrain, ((TransitionRoute)nextRoute).completed);
                            if (_trainHoppingListenerRemover != null)
                            {
                                _trainHoppingListenerRemover();
                                _trainHoppingListenerRemover = null;
                            }
                        }
                            );
                        _setSecondaryAnimation(newAnimation, ((TransitionRoute)nextRoute).completed);
                    }
                }
                else
                {
                    _setSecondaryAnimation(((TransitionRoute)nextRoute)._animation, ((TransitionRoute)nextRoute).completed);
                }
            }
            else
            {
                _setSecondaryAnimation(Animations.kAlwaysDismissedAnimation);
            }

            if (previousTrainHoppingListenerRemover != null)
            {
                previousTrainHoppingListenerRemover();
            }
        }