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; }))); }
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; })); }