diff --git a/src/Avalonia.Animation/Animatable.cs b/src/Avalonia.Animation/Animatable.cs
index 516f383b92..4b0f76c5d5 100644
--- a/src/Avalonia.Animation/Animatable.cs
+++ b/src/Avalonia.Animation/Animatable.cs
@@ -7,6 +7,7 @@ using System.Linq;
using System.Reactive.Linq;
using Avalonia.Collections;
using Avalonia.Data;
+using Avalonia.Animation.Animators;
namespace Avalonia.Animation
{
diff --git a/src/Avalonia.Animation/Animation.cs b/src/Avalonia.Animation/Animation.cs
index 0382ee9084..2a65531b77 100644
--- a/src/Avalonia.Animation/Animation.cs
+++ b/src/Avalonia.Animation/Animation.cs
@@ -7,6 +7,7 @@ using System.Linq;
using System.Reactive.Disposables;
using System.Reactive.Linq;
using System.Threading.Tasks;
+using Avalonia.Animation.Animators;
using Avalonia.Animation.Easings;
using Avalonia.Collections;
using Avalonia.Metadata;
@@ -49,27 +50,22 @@ namespace Avalonia.Animation
///
public Easing Easing { get; set; } = new LinearEasing();
-
///
- /// Gets or sets the delay time for this animation.
+ /// Gets or sets the initial delay time for this animation.
///
- ///
- /// Describes a delay to be added before the animation starts, and optionally between
- /// repeats of the animation if is set.
- ///
public TimeSpan Delay { get; set; } = TimeSpan.Zero;
///
- /// Gets or sets the amount of delay time between iterations.
+ /// Gets or sets the delay time in between iterations.
///
public TimeSpan DelayBetweenIterations { get; set; } = TimeSpan.Zero;
public static readonly DirectProperty SpeedRatioProperty =
- AvaloniaProperty.RegisterDirect(
- nameof(_speedRatio),
- o => o._speedRatio,
- (o, v) => o._speedRatio = v,
- 1d);
+ AvaloniaProperty.RegisterDirect(
+ nameof(_speedRatio),
+ o => o._speedRatio,
+ (o, v) => o._speedRatio = v,
+ 1d);
private double _speedRatio = 1d;
diff --git a/src/Avalonia.Animation/AnimationInstance`1.cs b/src/Avalonia.Animation/AnimationInstance`1.cs
index 208acfb6e9..7ff384d0d8 100644
--- a/src/Avalonia.Animation/AnimationInstance`1.cs
+++ b/src/Avalonia.Animation/AnimationInstance`1.cs
@@ -1,6 +1,7 @@
using System;
using System.Linq;
using System.Reactive.Linq;
+using Avalonia.Animation.Animators;
using Avalonia.Animation.Utils;
using Avalonia.Data;
using Avalonia.Reactive;
diff --git a/src/Avalonia.Animation/Animator`1.cs b/src/Avalonia.Animation/Animators/Animator`1.cs
similarity index 97%
rename from src/Avalonia.Animation/Animator`1.cs
rename to src/Avalonia.Animation/Animators/Animator`1.cs
index 031147f3ad..e143d01e95 100644
--- a/src/Avalonia.Animation/Animator`1.cs
+++ b/src/Avalonia.Animation/Animators/Animator`1.cs
@@ -10,10 +10,10 @@ using Avalonia.Collections;
using Avalonia.Data;
using Avalonia.Reactive;
-namespace Avalonia.Animation
+namespace Avalonia.Animation.Animators
{
///
- /// Base class for KeyFrames objects
+ /// Base class for objects
///
public abstract class Animator : AvaloniaList, IAnimator
{
@@ -141,7 +141,7 @@ namespace Avalonia.Animation
///
/// Interpolates a value given the desired time.
///
- protected abstract T Interpolate(double fraction, T start, T end);
+ public abstract T Interpolate(double progress, T oldValue, T newValue);
///
/// Verifies, converts and sorts keyframe values according to this class's target type.
diff --git a/src/Avalonia.Animation/DoubleAnimator.cs b/src/Avalonia.Animation/Animators/DoubleAnimator.cs
similarity index 65%
rename from src/Avalonia.Animation/DoubleAnimator.cs
rename to src/Avalonia.Animation/Animators/DoubleAnimator.cs
index 3cc93d10b3..4d72c52ea3 100644
--- a/src/Avalonia.Animation/DoubleAnimator.cs
+++ b/src/Avalonia.Animation/Animators/DoubleAnimator.cs
@@ -1,7 +1,7 @@
// Copyright (c) The Avalonia Project. All rights reserved.
// Licensed under the MIT license. See licence.md file in the project root for full license information.
-namespace Avalonia.Animation
+namespace Avalonia.Animation.Animators
{
///
/// Animator that handles properties.
@@ -9,9 +9,9 @@ namespace Avalonia.Animation
public class DoubleAnimator : Animator
{
///
- protected override double Interpolate(double fraction, double start, double end)
+ public override double Interpolate(double progress, double oldValue, double newValue)
{
- return start + (fraction) * (end - start);
+ return oldValue + (progress) * (newValue - oldValue);
}
}
}
diff --git a/src/Avalonia.Animation/DisposeAnimationInstanceSubject.cs b/src/Avalonia.Animation/DisposeAnimationInstanceSubject.cs
index a535b30b58..b44f392ce3 100644
--- a/src/Avalonia.Animation/DisposeAnimationInstanceSubject.cs
+++ b/src/Avalonia.Animation/DisposeAnimationInstanceSubject.cs
@@ -5,6 +5,7 @@ using System;
using System.Collections.Generic;
using System.Linq;
using System.Reactive.Linq;
+using Avalonia.Animation.Animators;
using Avalonia.Animation.Utils;
using Avalonia.Collections;
using Avalonia.Data;
@@ -33,8 +34,6 @@ namespace Avalonia.Animation
this._onComplete = onComplete;
this._clock = clock;
}
-
-
public void Dispose()
{
_lastInstance?.Dispose();
diff --git a/src/Avalonia.Animation/IEasing.cs b/src/Avalonia.Animation/Easing/IEasing.cs
similarity index 100%
rename from src/Avalonia.Animation/IEasing.cs
rename to src/Avalonia.Animation/Easing/IEasing.cs
diff --git a/src/Avalonia.Animation/Properties/AssemblyInfo.cs b/src/Avalonia.Animation/Properties/AssemblyInfo.cs
index 59d1357bb3..985a8e5bfe 100644
--- a/src/Avalonia.Animation/Properties/AssemblyInfo.cs
+++ b/src/Avalonia.Animation/Properties/AssemblyInfo.cs
@@ -5,4 +5,5 @@ using Avalonia.Metadata;
using System.Reflection;
[assembly: XmlnsDefinition("https://github.com/avaloniaui", "Avalonia.Animation")]
-[assembly: XmlnsDefinition("https://github.com/avaloniaui", "Avalonia.Animation.Easings")]
\ No newline at end of file
+[assembly: XmlnsDefinition("https://github.com/avaloniaui", "Avalonia.Animation.Easings")]
+[assembly: XmlnsDefinition("https://github.com/avaloniaui", "Avalonia.Animation.Animators")]
\ No newline at end of file
diff --git a/src/Avalonia.Animation/DoubleTransition.cs b/src/Avalonia.Animation/Transitions/DoubleTransition.cs
similarity index 100%
rename from src/Avalonia.Animation/DoubleTransition.cs
rename to src/Avalonia.Animation/Transitions/DoubleTransition.cs
diff --git a/src/Avalonia.Animation/FloatTransition.cs b/src/Avalonia.Animation/Transitions/FloatTransition.cs
similarity index 100%
rename from src/Avalonia.Animation/FloatTransition.cs
rename to src/Avalonia.Animation/Transitions/FloatTransition.cs
diff --git a/src/Avalonia.Animation/IntegerTransition.cs b/src/Avalonia.Animation/Transitions/IntegerTransition.cs
similarity index 100%
rename from src/Avalonia.Animation/IntegerTransition.cs
rename to src/Avalonia.Animation/Transitions/IntegerTransition.cs
diff --git a/src/Avalonia.Visuals/Animation/ColorAnimator.cs b/src/Avalonia.Visuals/Animation/Animators/ColorAnimator.cs
similarity index 64%
rename from src/Avalonia.Visuals/Animation/ColorAnimator.cs
rename to src/Avalonia.Visuals/Animation/Animators/ColorAnimator.cs
index c384bb998e..734fa820be 100644
--- a/src/Avalonia.Visuals/Animation/ColorAnimator.cs
+++ b/src/Avalonia.Visuals/Animation/Animators/ColorAnimator.cs
@@ -5,7 +5,7 @@ using System;
using Avalonia.Logging;
using Avalonia.Media;
-namespace Avalonia.Animation
+namespace Avalonia.Animation.Animators
{
///
/// Animator that interpolates through
@@ -29,32 +29,32 @@ namespace Avalonia.Animation
return srgb <= 0.04045d ? srgb / 12.92d : (double)Math.Pow((srgb + 0.055d) / 1.055d, 2.4d);
}
- protected override Color Interpolate(double fraction, Color start, Color end)
+ public override Color Interpolate(double progress, Color oldValue, Color newValue)
{
- var startA = start.A / 255d;
- var startR = start.R / 255d;
- var startG = start.G / 255d;
- var startB = start.B / 255d;
+ var oldA = oldValue.A / 255d;
+ var oldR = oldValue.R / 255d;
+ var oldG = oldValue.G / 255d;
+ var oldB = oldValue.B / 255d;
- var endA = end.A / 255d;
- var endR = end.R / 255d;
- var endG = end.G / 255d;
- var endB = end.B / 255d;
+ var newA = newValue.A / 255d;
+ var newR = newValue.R / 255d;
+ var newG = newValue.G / 255d;
+ var newB = newValue.B / 255d;
// convert from sRGB to linear
- startR = EOCF_sRGB(startR);
- startG = EOCF_sRGB(startG);
- startB = EOCF_sRGB(startB);
+ oldR = EOCF_sRGB(oldR);
+ oldG = EOCF_sRGB(oldG);
+ oldB = EOCF_sRGB(oldB);
- endR = EOCF_sRGB(endR);
- endG = EOCF_sRGB(endG);
- endB = EOCF_sRGB(endB);
+ newR = EOCF_sRGB(newR);
+ newG = EOCF_sRGB(newG);
+ newB = EOCF_sRGB(newB);
// compute the interpolated color in linear space
- var a = startA + fraction * (endA - startA);
- var r = startR + fraction * (endR - startR);
- var g = startG + fraction * (endG - startG);
- var b = startB + fraction * (endB - startB);
+ var a = oldA + progress * (newA - oldA);
+ var r = oldR + progress * (newR - oldR);
+ var g = oldG + progress * (newG - oldG);
+ var b = oldB + progress * (newB - oldB);
// convert back to sRGB in the [0..255] range
a = a * 255d;
diff --git a/src/Avalonia.Visuals/Animation/Animators/ThicknessAnimator.cs b/src/Avalonia.Visuals/Animation/Animators/ThicknessAnimator.cs
new file mode 100644
index 0000000000..ccc200d64f
--- /dev/null
+++ b/src/Avalonia.Visuals/Animation/Animators/ThicknessAnimator.cs
@@ -0,0 +1,27 @@
+using System;
+using Avalonia.Logging;
+using Avalonia.Media;
+
+namespace Avalonia.Animation.Animators
+{
+ ///
+ /// Animator that handles properties.
+ ///
+ public class ThicknessAnimator : Animator
+ {
+ public override Thickness Interpolate(double progress, Thickness oldValue, Thickness newValue)
+ {
+ var deltaL = newValue.Left - oldValue.Left;
+ var deltaT = newValue.Top - oldValue.Top;
+ var deltaR = newValue.Right - oldValue.Right;
+ var deltaB = newValue.Bottom - oldValue.Bottom;
+
+ var nL = progress * deltaL + oldValue.Left;
+ var nT = progress * deltaT + oldValue.Right;
+ var nR = progress * deltaR + oldValue.Top;
+ var nB = progress * deltaB + oldValue.Bottom;
+
+ return new Thickness(nL, nT, nR, nB);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Avalonia.Visuals/Animation/TransformAnimator.cs b/src/Avalonia.Visuals/Animation/Animators/TransformAnimator.cs
similarity index 96%
rename from src/Avalonia.Visuals/Animation/TransformAnimator.cs
rename to src/Avalonia.Visuals/Animation/Animators/TransformAnimator.cs
index d95ec1092a..144c1dda88 100644
--- a/src/Avalonia.Visuals/Animation/TransformAnimator.cs
+++ b/src/Avalonia.Visuals/Animation/Animators/TransformAnimator.cs
@@ -2,7 +2,7 @@
using Avalonia.Logging;
using Avalonia.Media;
-namespace Avalonia.Animation
+namespace Avalonia.Animation.Animators
{
///
/// Animator that handles properties.
@@ -73,9 +73,8 @@ namespace Avalonia.Animation
return null;
}
-
///
- protected override double Interpolate(double fraction, double start, double end) => 0;
+ public override double Interpolate(double p, double o, double n) => 0;
void InitializeChildAnimator()
{
@@ -88,6 +87,5 @@ namespace Avalonia.Animation
childAnimator.Property = Property;
}
-
}
-}
+}
\ No newline at end of file
diff --git a/src/Avalonia.Visuals/Animation/ThicknessAnimator.cs b/src/Avalonia.Visuals/Animation/ThicknessAnimator.cs
deleted file mode 100644
index acf6075f89..0000000000
--- a/src/Avalonia.Visuals/Animation/ThicknessAnimator.cs
+++ /dev/null
@@ -1,27 +0,0 @@
-using System;
-using Avalonia.Logging;
-using Avalonia.Media;
-
-namespace Avalonia.Animation
-{
- ///
- /// Animator that handles properties.
- ///
- public class ThicknessAnimator : Animator
- {
- protected override Thickness Interpolate(double fraction, Thickness start, Thickness end)
- {
- var deltaL = end.Left - start.Left;
- var deltaT = end.Top - start.Top;
- var deltaR = end.Right - start.Right;
- var deltaB = end.Bottom - start.Bottom;
-
- var nL = fraction * deltaL + start.Left;
- var nT = fraction * deltaT + start.Right;
- var nR = fraction * deltaR + start.Top;
- var nB = fraction * deltaB + start.Bottom;
-
- return new Thickness(nL, nT, nR, nB);
- }
- }
-}
\ No newline at end of file
diff --git a/src/Avalonia.Visuals/Animation/PointTransition.cs b/src/Avalonia.Visuals/Animation/Transitions/PointTransition.cs
similarity index 100%
rename from src/Avalonia.Visuals/Animation/PointTransition.cs
rename to src/Avalonia.Visuals/Animation/Transitions/PointTransition.cs
diff --git a/src/Avalonia.Visuals/Animation/ThicknessTransition.cs b/src/Avalonia.Visuals/Animation/Transitions/ThicknessTransition.cs
similarity index 100%
rename from src/Avalonia.Visuals/Animation/ThicknessTransition.cs
rename to src/Avalonia.Visuals/Animation/Transitions/ThicknessTransition.cs
diff --git a/src/Avalonia.Visuals/Media/Color.cs b/src/Avalonia.Visuals/Media/Color.cs
index 263e5adc4e..a37463a0f0 100644
--- a/src/Avalonia.Visuals/Media/Color.cs
+++ b/src/Avalonia.Visuals/Media/Color.cs
@@ -4,6 +4,7 @@
using System;
using System.Globalization;
using Avalonia.Animation;
+using Avalonia.Animation.Animators;
namespace Avalonia.Media
{
diff --git a/src/Avalonia.Visuals/Media/Transform.cs b/src/Avalonia.Visuals/Media/Transform.cs
index 677514763c..7a70657ce0 100644
--- a/src/Avalonia.Visuals/Media/Transform.cs
+++ b/src/Avalonia.Visuals/Media/Transform.cs
@@ -3,6 +3,7 @@
using System;
using Avalonia.Animation;
+using Avalonia.Animation.Animators;
using Avalonia.VisualTree;
namespace Avalonia.Media
diff --git a/src/Avalonia.Visuals/Thickness.cs b/src/Avalonia.Visuals/Thickness.cs
index d8581aa2fb..9d4ee2d704 100644
--- a/src/Avalonia.Visuals/Thickness.cs
+++ b/src/Avalonia.Visuals/Thickness.cs
@@ -4,6 +4,7 @@
using System;
using System.Globalization;
using Avalonia.Animation;
+using Avalonia.Animation.Animators;
using Avalonia.Utilities;
namespace Avalonia