Exemplo n.º 1
0
        private Task GetAnimationTask(TouchEff sender, TouchState touchState, HoverState hoverState, double?durationMultiplier = null)
        {
            if (sender.Control == null)
            {
                return(Task.CompletedTask);
            }
            var token    = _animationTokenSource.Token;
            var duration = sender.RegularAnimationDuration;
            var easing   = sender.RegularAnimationEasing;

            if (touchState == TouchState.Pressed)
            {
                duration = sender.RegularAnimationDuration;
                easing   = sender.PressedAnimationEasing;
            }
            else if (hoverState == HoverState.Hovering)
            {
                duration = sender.HoveredAnimationDuration;
                easing   = sender.HoveredAnimationEasing;
            }
            duration = duration.AdjustDurationMultiplier(durationMultiplier);

            if (duration <= 0 &&
                Device.RuntimePlatform != Device.iOS &&
                Device.RuntimePlatform != Device.macOS)
            {
                duration = 1;
            }

            sender.RaiseAnimationStarted(touchState, hoverState, duration);
            return(Task.WhenAll(
                       _customAnimationTaskGetter?.Invoke(sender, touchState, hoverState, duration, easing, token) ?? Task.FromResult(true),
                       SetBackgroundColorAsync(sender, touchState, hoverState, duration, easing),
                       SetOpacityAsync(sender, touchState, hoverState, duration, easing),
                       SetScaleAsync(sender, touchState, hoverState, duration, easing),
                       SetTranslationAsync(sender, touchState, hoverState, duration, easing),
                       SetRotationAsync(sender, touchState, hoverState, duration, easing),
                       SetRotationXAsync(sender, touchState, hoverState, duration, easing),
                       SetRotationYAsync(sender, touchState, hoverState, duration, easing),
                       Task.Run(async() =>
            {
                _animationProgress = 0;
                _animationState = touchState;

                for (var progress = AnimationProgressDelay; progress < duration; progress += AnimationProgressDelay)
                {
                    await Task.Delay(AnimationProgressDelay).ConfigureAwait(false);
                    if (token.IsCancellationRequested)
                    {
                        return;
                    }
                    _animationProgress = (double)progress / duration;
                }
                _animationProgress = 1;
            })));
        }
Exemplo n.º 2
0
        private Task GetAnimationTask(TouchEff sender, TouchState state, double? durationMultiplier = null)
        {
            if (sender.Control == null)
            {
                return Task.CompletedTask;
            }
            var token = _animationTokenSource.Token;
            var duration = (state == TouchState.Regular
                ? sender.RegularAnimationDuration
                : sender.PressedAnimationDuration).AdjustDurationMultiplier(durationMultiplier);

            if(duration <= 0 && Device.RuntimePlatform == Device.Android)
            {
                duration = 1;
            }

            sender.RaiseAnimationStarted(state, duration);
            return Task.WhenAll(
                _customAnimationTaskGetter?.Invoke(sender, state, duration, token) ?? Task.FromResult(true),
                SetBackgroundColorAsync(sender, state, duration),
                SetOpacityAsync(sender, state, duration),
                SetScaleAsync(sender, state, duration),
                SetTranslationAsync(sender, state, duration),
                SetRotationAsync(sender, state, duration),
                SetRotationXAsync(sender, state, duration),
                SetRotationYAsync(sender, state, duration),
                Task.Run(async () =>
                {
                    _animationProgress = 0;
                    _animationState = state;

                    for (var progress = AnimationProgressDelay; progress < duration; progress += AnimationProgressDelay)
                    {
                        await Task.Delay(AnimationProgressDelay).ConfigureAwait(false);
                        if (token.IsCancellationRequested)
                        {
                            return;
                        }
                        _animationProgress = (double)progress / duration;
                    }
                    _animationProgress = 1;
                }));
        }