From a987c4648b77407c9b17519a52747d4868ae524a Mon Sep 17 00:00:00 2001 From: Jeremy Koritzinsky Date: Thu, 6 Sep 2018 22:57:06 -0500 Subject: [PATCH] Move Pause PlayState time tracking into Clock. --- src/Avalonia.Animation/AnimationInstance`1.cs | 26 +++--------------- src/Avalonia.Animation/Clock.cs | 27 ++++++++++++++++--- 2 files changed, 27 insertions(+), 26 deletions(-) diff --git a/src/Avalonia.Animation/AnimationInstance`1.cs b/src/Avalonia.Animation/AnimationInstance`1.cs index a8d8dc73ef..a2d25e4524 100644 --- a/src/Avalonia.Animation/AnimationInstance`1.cs +++ b/src/Avalonia.Animation/AnimationInstance`1.cs @@ -8,7 +8,7 @@ using Avalonia.Reactive; namespace Avalonia.Animation { /// - /// Handles interpolatoin and time-related functions + /// Handles interpolation and time-related functions /// for keyframe animations. /// internal class AnimationInstance : SingleSubscriberObservableBase @@ -30,8 +30,6 @@ namespace Avalonia.Animation private TimeSpan _delay; private TimeSpan _duration; private TimeSpan _firstFrameCount; - private TimeSpan _internalClock; - private TimeSpan? _previousClock; private Easings.Easing _easeFunc; private Action _onCompleteAction; private Func _interpolator; @@ -120,23 +118,6 @@ namespace Avalonia.Animation if (Animation.GlobalPlayState == PlayState.Stop || _targetControl.PlayState == PlayState.Stop) DoComplete(); - if (!_previousClock.HasValue) - { - _previousClock = systemTime; - _internalClock = TimeSpan.Zero; - } - else - { - if (Animation.GlobalPlayState == PlayState.Pause || _targetControl.PlayState == PlayState.Pause) - { - _previousClock = systemTime; - return; - } - var delta = systemTime - _previousClock; - _internalClock += delta.Value; - _previousClock = systemTime; - } - if (!_gotFirstKFValue) { _firstKFValue = (T)_parent.First().Value; @@ -145,7 +126,7 @@ namespace Avalonia.Animation if (!_gotFirstFrameCount) { - _firstFrameCount = _internalClock; + _firstFrameCount = systemTime; _gotFirstFrameCount = true; } } @@ -154,7 +135,7 @@ namespace Avalonia.Animation { DoPlayStatesAndTime(systemTime); - var time = _internalClock - _firstFrameCount; + var time = systemTime - _firstFrameCount; var delayEndpoint = _delay; var iterationEndpoint = delayEndpoint + _duration; @@ -179,7 +160,6 @@ namespace Avalonia.Animation } else { - _previousClock = systemTime; return; } diff --git a/src/Avalonia.Animation/Clock.cs b/src/Avalonia.Animation/Clock.cs index 1ba6425551..ced63163c9 100644 --- a/src/Avalonia.Animation/Clock.cs +++ b/src/Avalonia.Animation/Clock.cs @@ -14,6 +14,9 @@ namespace Avalonia.Animation private IObservable _connectedObservable; + private TimeSpan? _previousTime; + private TimeSpan _internalTime; + public Clock() { _observable = new ClockObservable(); @@ -28,9 +31,27 @@ namespace Avalonia.Animation public void Pulse(long tickCount) { - var time = TimeSpan.FromMilliseconds(tickCount); - _observable.Pulse(time); - CurrentTime = time; + var systemTime = TimeSpan.FromMilliseconds(tickCount); + + if (!_previousTime.HasValue) + { + _previousTime = systemTime; + _internalTime = TimeSpan.Zero; + } + else + { + if (PlayState == PlayState.Pause) + { + _previousTime = systemTime; + return; + } + var delta = systemTime - _previousTime; + _internalTime += delta.Value; + _previousTime = systemTime; + } + + _observable.Pulse(_internalTime); + CurrentTime = _internalTime; } public IDisposable Subscribe(IObserver observer)