diff --git a/src/Avalonia.Animation/Transitions/DoubleTransition.cs b/src/Avalonia.Animation/Transitions/DoubleTransition.cs
index 8cae1e1f81..d5bb1aac20 100644
--- a/src/Avalonia.Animation/Transitions/DoubleTransition.cs
+++ b/src/Avalonia.Animation/Transitions/DoubleTransition.cs
@@ -1,6 +1,8 @@
using System;
using System.Reactive.Linq;
+using Avalonia.Animation.Animators;
+
namespace Avalonia.Animation
{
///
@@ -8,15 +10,13 @@ namespace Avalonia.Animation
///
public class DoubleTransition : Transition
{
+ private static readonly DoubleAnimator s_animator = new DoubleAnimator();
+
///
public override IObservable DoTransition(IObservable progress, double oldValue, double newValue)
{
return progress
- .Select(p =>
- {
- var f = Easing.Ease(p);
- return ((newValue - oldValue) * f) + oldValue;
- });
+ .Select(progress => s_animator.Interpolate(Easing.Ease(progress), oldValue, newValue));
}
}
}
diff --git a/src/Avalonia.Animation/Transitions/FloatTransition.cs b/src/Avalonia.Animation/Transitions/FloatTransition.cs
index 427563e559..37b644fa96 100644
--- a/src/Avalonia.Animation/Transitions/FloatTransition.cs
+++ b/src/Avalonia.Animation/Transitions/FloatTransition.cs
@@ -1,6 +1,8 @@
using System;
using System.Reactive.Linq;
+using Avalonia.Animation.Animators;
+
namespace Avalonia.Animation
{
///
@@ -8,12 +10,13 @@ namespace Avalonia.Animation
///
public class FloatTransition : Transition
{
+ private static readonly FloatAnimator s_animator = new FloatAnimator();
+
///
public override IObservable DoTransition(IObservable progress, float oldValue, float newValue)
{
- var delta = newValue - oldValue;
return progress
- .Select(p => (float)Easing.Ease(p) * delta + oldValue);
+ .Select(progress => s_animator.Interpolate(Easing.Ease(progress), oldValue, newValue));
}
}
}
diff --git a/src/Avalonia.Animation/Transitions/IntegerTransition.cs b/src/Avalonia.Animation/Transitions/IntegerTransition.cs
index 7a85bd75dc..223b2ba531 100644
--- a/src/Avalonia.Animation/Transitions/IntegerTransition.cs
+++ b/src/Avalonia.Animation/Transitions/IntegerTransition.cs
@@ -1,6 +1,8 @@
using System;
using System.Reactive.Linq;
+using Avalonia.Animation.Animators;
+
namespace Avalonia.Animation
{
///
@@ -8,12 +10,13 @@ namespace Avalonia.Animation
///
public class IntegerTransition : Transition
{
+ private static readonly Int32Animator s_animator = new Int32Animator();
+
///
public override IObservable DoTransition(IObservable progress, int oldValue, int newValue)
{
- var delta = newValue - oldValue;
return progress
- .Select(p => (int)(Easing.Ease(p) * delta + oldValue));
+ .Select(progress => s_animator.Interpolate(Easing.Ease(progress), oldValue, newValue));
}
}
}
diff --git a/src/Avalonia.Visuals/Animation/Transitions/CornerRadiusTransition.cs b/src/Avalonia.Visuals/Animation/Transitions/CornerRadiusTransition.cs
index 0b0f04ca94..9ffdf53694 100644
--- a/src/Avalonia.Visuals/Animation/Transitions/CornerRadiusTransition.cs
+++ b/src/Avalonia.Visuals/Animation/Transitions/CornerRadiusTransition.cs
@@ -1,6 +1,8 @@
using System;
using System.Reactive.Linq;
+using Avalonia.Animation.Animators;
+
namespace Avalonia.Animation
{
///
@@ -8,26 +10,13 @@ namespace Avalonia.Animation
///
public class CornerRadiusTransition : Transition
{
+ private static readonly CornerRadiusAnimator s_animator = new CornerRadiusAnimator();
+
///
public override IObservable DoTransition(IObservable progress, CornerRadius oldValue, CornerRadius newValue)
{
return progress
- .Select(p =>
- {
- var f = Easing.Ease(p);
-
- var deltaTL = newValue.TopLeft - oldValue.TopLeft;
- var deltaTR = newValue.TopRight - oldValue.TopRight;
- var deltaBR = newValue.BottomRight - oldValue.BottomRight;
- var deltaBL = newValue.BottomLeft - oldValue.BottomLeft;
-
- var nTL = f * deltaTL + oldValue.TopLeft;
- var nTR = f * deltaTR + oldValue.TopRight;
- var nBR = f * deltaBR + oldValue.BottomRight;
- var nBL = f * deltaBL + oldValue.BottomLeft;
-
- return new CornerRadius(nTL, nTR, nBR, nBL);
- });
+ .Select(progress => s_animator.Interpolate(Easing.Ease(progress), oldValue, newValue));
}
}
}
diff --git a/src/Avalonia.Visuals/Animation/Transitions/PointTransition.cs b/src/Avalonia.Visuals/Animation/Transitions/PointTransition.cs
index 29db5fc868..fbe24c6d55 100644
--- a/src/Avalonia.Visuals/Animation/Transitions/PointTransition.cs
+++ b/src/Avalonia.Visuals/Animation/Transitions/PointTransition.cs
@@ -1,6 +1,8 @@
using System;
using System.Reactive.Linq;
+using Avalonia.Animation.Animators;
+
namespace Avalonia.Animation
{
///
@@ -8,15 +10,13 @@ namespace Avalonia.Animation
///
public class PointTransition : Transition
{
+ private static readonly PointAnimator s_animator = new PointAnimator();
+
///
public override IObservable DoTransition(IObservable progress, Point oldValue, Point newValue)
{
return progress
- .Select(p =>
- {
- var f = Easing.Ease(p);
- return ((newValue - oldValue) * f) + oldValue;
- });
+ .Select(progress => s_animator.Interpolate(Easing.Ease(progress), oldValue, newValue));
}
}
}
diff --git a/src/Avalonia.Visuals/Animation/Transitions/SizeTransition.cs b/src/Avalonia.Visuals/Animation/Transitions/SizeTransition.cs
index b40e789915..464f83bec7 100644
--- a/src/Avalonia.Visuals/Animation/Transitions/SizeTransition.cs
+++ b/src/Avalonia.Visuals/Animation/Transitions/SizeTransition.cs
@@ -1,6 +1,8 @@
using System;
using System.Reactive.Linq;
+using Avalonia.Animation.Animators;
+
namespace Avalonia.Animation
{
///
@@ -8,15 +10,13 @@ namespace Avalonia.Animation
///
public class SizeTransition : Transition
{
+ private static readonly SizeAnimator s_animator = new SizeAnimator();
+
///
public override IObservable DoTransition(IObservable progress, Size oldValue, Size newValue)
{
return progress
- .Select(p =>
- {
- var f = Easing.Ease(p);
- return ((newValue - oldValue) * f) + oldValue;
- });
+ .Select(progress => s_animator.Interpolate(Easing.Ease(progress), oldValue, newValue));
}
}
}
diff --git a/src/Avalonia.Visuals/Animation/Transitions/ThicknessTransition.cs b/src/Avalonia.Visuals/Animation/Transitions/ThicknessTransition.cs
index 28d4ea067f..9fb3380780 100644
--- a/src/Avalonia.Visuals/Animation/Transitions/ThicknessTransition.cs
+++ b/src/Avalonia.Visuals/Animation/Transitions/ThicknessTransition.cs
@@ -1,6 +1,8 @@
using System;
using System.Reactive.Linq;
+using Avalonia.Animation.Animators;
+
namespace Avalonia.Animation
{
///
@@ -8,15 +10,13 @@ namespace Avalonia.Animation
///
public class ThicknessTransition : Transition
{
+ private static readonly ThicknessAnimator s_animator = new ThicknessAnimator();
+
///
public override IObservable DoTransition(IObservable progress, Thickness oldValue, Thickness newValue)
{
return progress
- .Select(p =>
- {
- var f = Easing.Ease(p);
- return ((newValue - oldValue) * f) + oldValue;
- });
+ .Select(progress => s_animator.Interpolate(Easing.Ease(progress), oldValue, newValue));
}
}
}
diff --git a/src/Avalonia.Visuals/Animation/Transitions/VectorTransition.cs b/src/Avalonia.Visuals/Animation/Transitions/VectorTransition.cs
index c073e8e192..5038117faa 100644
--- a/src/Avalonia.Visuals/Animation/Transitions/VectorTransition.cs
+++ b/src/Avalonia.Visuals/Animation/Transitions/VectorTransition.cs
@@ -1,6 +1,8 @@
using System;
using System.Reactive.Linq;
+using Avalonia.Animation.Animators;
+
namespace Avalonia.Animation
{
///
@@ -8,15 +10,13 @@ namespace Avalonia.Animation
///
public class VectorTransition : Transition
{
+ private static readonly VectorAnimator s_animator = new VectorAnimator();
+
///
public override IObservable DoTransition(IObservable progress, Vector oldValue, Vector newValue)
{
return progress
- .Select(p =>
- {
- var f = Easing.Ease(p);
- return ((newValue - oldValue) * f) + oldValue;
- });
+ .Select(progress => s_animator.Interpolate(Easing.Ease(progress), oldValue, newValue));
}
}
}