|
@@ -19,6 +19,7 @@ namespace Avalonia.Animation
|
|
|
private ulong? _iterationCount;
|
|
|
private ulong _currentIteration;
|
|
|
private bool _gotFirstKFValue;
|
|
|
+ private bool _playbackReversed;
|
|
|
private FillMode _fillMode;
|
|
|
private PlaybackDirection _playbackDirection;
|
|
|
private Animator<T> _animator;
|
|
@@ -160,9 +161,14 @@ namespace Avalonia.Animation
|
|
|
|
|
|
_currentIteration = (ulong)(opsTime / iterationTime);
|
|
|
|
|
|
- // Stop animation when the current iteration is beyond the iteration count.
|
|
|
+ // Stop animation when the current iteration is beyond the iteration count
|
|
|
+ // and snap the last iteration value to exact values.
|
|
|
if ((_currentIteration + 1) > _iterationCount)
|
|
|
+ {
|
|
|
+ var easedTime = _easeFunc.Ease(_playbackReversed ? 0.0 : 1.0);
|
|
|
+ _lastInterpValue = _interpolator(easedTime, _neutralValue);
|
|
|
DoComplete();
|
|
|
+ }
|
|
|
|
|
|
if (playbackTime <= iterDuration)
|
|
|
{
|
|
@@ -170,27 +176,26 @@ namespace Avalonia.Animation
|
|
|
var normalizedTime = playbackTime / iterDuration;
|
|
|
|
|
|
// Check if normalized time needs to be reversed according to PlaybackDirection
|
|
|
-
|
|
|
- bool playbackReversed;
|
|
|
+
|
|
|
switch (_playbackDirection)
|
|
|
{
|
|
|
case PlaybackDirection.Normal:
|
|
|
- playbackReversed = false;
|
|
|
+ _playbackReversed = false;
|
|
|
break;
|
|
|
case PlaybackDirection.Reverse:
|
|
|
- playbackReversed = true;
|
|
|
+ _playbackReversed = true;
|
|
|
break;
|
|
|
case PlaybackDirection.Alternate:
|
|
|
- playbackReversed = (_currentIteration % 2 == 0) ? false : true;
|
|
|
+ _playbackReversed = (_currentIteration % 2 == 0) ? false : true;
|
|
|
break;
|
|
|
case PlaybackDirection.AlternateReverse:
|
|
|
- playbackReversed = (_currentIteration % 2 == 0) ? true : false;
|
|
|
+ _playbackReversed = (_currentIteration % 2 == 0) ? true : false;
|
|
|
break;
|
|
|
default:
|
|
|
throw new InvalidOperationException($"Animation direction value is unknown: {_playbackDirection}");
|
|
|
}
|
|
|
|
|
|
- if (playbackReversed)
|
|
|
+ if (_playbackReversed)
|
|
|
normalizedTime = 1 - normalizedTime;
|
|
|
|
|
|
// Ease and interpolate
|