Browse Source

Additional fixes for AnimationInstance.

pull/2163/head
Jumar Macato 8 years ago
parent
commit
b489e3a935
No known key found for this signature in database GPG Key ID: B19884DAC3A5BF3F
  1. 31
      src/Avalonia.Animation/AnimationInstance`1.cs

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

@ -15,9 +15,8 @@ namespace Avalonia.Animation
{ {
private T _lastInterpValue; private T _lastInterpValue;
private T _firstKFValue; private T _firstKFValue;
private float _iterationCount; private ulong? _iterationCount;
private long _currentIteration; private ulong _currentIteration;
private bool _isLooping;
private bool _gotFirstKFValue; private bool _gotFirstKFValue;
private FillMode _fillMode; private FillMode _fillMode;
private PlaybackDirection _animationDirection; private PlaybackDirection _animationDirection;
@ -58,10 +57,7 @@ namespace Avalonia.Animation
{ {
case RepeatType.None: case RepeatType.None:
_iterationCount = 1; _iterationCount = 1;
break; break;
case RepeatType.Loop:
_iterationCount = float.PositiveInfinity;
break;
case RepeatType.Repeat: case RepeatType.Repeat:
_iterationCount = animation.RepeatCount.Value; _iterationCount = animation.RepeatCount.Value;
break; break;
@ -138,7 +134,8 @@ namespace Avalonia.Animation
private void InternalStep(TimeSpan time) private void InternalStep(TimeSpan time)
{ {
DoPlayStates(); DoPlayStates();
// Scale timebases according to speedratio.
var indexTime = time.Ticks; var indexTime = time.Ticks;
var iterDuration = _duration.Ticks * _speedRatio; var iterDuration = _duration.Ticks * _speedRatio;
var iterDelay = _iterationDelay.Ticks * _speedRatio; var iterDelay = _iterationDelay.Ticks * _speedRatio;
@ -150,25 +147,27 @@ namespace Avalonia.Animation
} }
else else
{ {
var fullIterationTime = iterDuration + iterDelay; // Calculate timebases.
var iterationTime = iterDuration + iterDelay;
var opsTime = indexTime - initDelay; var opsTime = indexTime - initDelay;
var playbackTime = opsTime % fullIterationTime; var playbackTime = opsTime % iterationTime;
_currentIteration = (long)Math.Floor(opsTime / fullIterationTime); _currentIteration = (ulong)(opsTime / iterationTime);
// Stop animation when the current iteration is beyond the iteration count.
if ((_currentIteration + 1) > _iterationCount) if ((_currentIteration + 1) > _iterationCount)
DoComplete(); DoComplete();
if (playbackTime <= iterDuration) if (playbackTime <= iterDuration)
{ {
// Normalize time for interpolation.
var normalizedTime = playbackTime / iterDuration; var normalizedTime = playbackTime / iterDuration;
// Check if normalized time needs to be reversed.
bool isCurIterReverse = _animationDirection == PlaybackDirection.Normal ? false : bool isCurIterReverse = _animationDirection == PlaybackDirection.Normal ? false :
_animationDirection == PlaybackDirection.Alternate ? (_currentIteration % 2 == 0) ? false : true : _animationDirection == PlaybackDirection.Alternate ? (_currentIteration % 2 == 0) ? false : true :
_animationDirection == PlaybackDirection.AlternateReverse ? (_currentIteration % 2 == 0) ? true : false : _animationDirection == PlaybackDirection.AlternateReverse ? (_currentIteration % 2 == 0) ? true : false :
_animationDirection == PlaybackDirection.Reverse ? true : false; _animationDirection == PlaybackDirection.Reverse ? true : false;
// Check if normalized time needs to be reversed.
if (isCurIterReverse) if (isCurIterReverse)
normalizedTime = 1 - normalizedTime; normalizedTime = 1 - normalizedTime;
@ -178,7 +177,11 @@ namespace Avalonia.Animation
PublishNext(_lastInterpValue); PublishNext(_lastInterpValue);
} }
else if (playbackTime > iterDuration & playbackTime <= fullIterationTime & iterDelay > 0) else if (playbackTime > iterDuration &
playbackTime <= iterationTime &
iterDelay > 0 &
// The last iteration's trailing delay should be skipped.
(_currentIteration + 1) < _iterationCount)
{ {
DoDelay(); DoDelay();
} }

Loading…
Cancel
Save