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