Browse Source

Move Pause PlayState time tracking into Clock.

pull/1715/head
Jeremy Koritzinsky 8 years ago
parent
commit
a987c4648b
  1. 26
      src/Avalonia.Animation/AnimationInstance`1.cs
  2. 27
      src/Avalonia.Animation/Clock.cs

26
src/Avalonia.Animation/AnimationInstance`1.cs

@ -8,7 +8,7 @@ using Avalonia.Reactive;
namespace Avalonia.Animation
{
/// <summary>
/// Handles interpolatoin and time-related functions
/// Handles interpolation and time-related functions
/// for keyframe animations.
/// </summary>
internal class AnimationInstance<T> : SingleSubscriberObservableBase<T>
@ -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<double, T, T> _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;
}

27
src/Avalonia.Animation/Clock.cs

@ -14,6 +14,9 @@ namespace Avalonia.Animation
private IObservable<TimeSpan> _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<TimeSpan> observer)

Loading…
Cancel
Save