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)