From c5f0e18d55a3485960cbacaa2d88fdfa50e32b6a Mon Sep 17 00:00:00 2001 From: Max Katz Date: Wed, 28 Dec 2022 14:47:29 -0800 Subject: [PATCH 1/2] Support TransformOperations animations in Brush animator --- .../Animators/GradientBrushAnimator.cs | 26 ++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/src/Avalonia.Base/Animation/Animators/GradientBrushAnimator.cs b/src/Avalonia.Base/Animation/Animators/GradientBrushAnimator.cs index 068c190fa1..7da1b68051 100644 --- a/src/Avalonia.Base/Animation/Animators/GradientBrushAnimator.cs +++ b/src/Avalonia.Base/Animation/Animators/GradientBrushAnimator.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using Avalonia.Data; using Avalonia.Media; using Avalonia.Media.Immutable; +using Avalonia.Media.Transformation; #nullable enable @@ -30,7 +31,7 @@ namespace Avalonia.Animation.Animators return new ImmutableRadialGradientBrush( InterpolateStops(progress, oldValue.GradientStops, newValue.GradientStops), s_doubleAnimator.Interpolate(progress, oldValue.Opacity, newValue.Opacity), - oldValue.Transform is { } ? new ImmutableTransform(oldValue.Transform.Value) : null, + InterpolateTransform(progress, oldValue.Transform, newValue.Transform), s_relativePointAnimator.Interpolate(progress, oldValue.TransformOrigin, newValue.TransformOrigin), oldValue.SpreadMethod, s_relativePointAnimator.Interpolate(progress, oldRadial.Center, newRadial.Center), @@ -41,7 +42,7 @@ namespace Avalonia.Animation.Animators return new ImmutableConicGradientBrush( InterpolateStops(progress, oldValue.GradientStops, newValue.GradientStops), s_doubleAnimator.Interpolate(progress, oldValue.Opacity, newValue.Opacity), - oldValue.Transform is { } ? new ImmutableTransform(oldValue.Transform.Value) : null, + InterpolateTransform(progress, oldValue.Transform, newValue.Transform), s_relativePointAnimator.Interpolate(progress, oldValue.TransformOrigin, newValue.TransformOrigin), oldValue.SpreadMethod, s_relativePointAnimator.Interpolate(progress, oldConic.Center, newConic.Center), @@ -51,7 +52,7 @@ namespace Avalonia.Animation.Animators return new ImmutableLinearGradientBrush( InterpolateStops(progress, oldValue.GradientStops, newValue.GradientStops), s_doubleAnimator.Interpolate(progress, oldValue.Opacity, newValue.Opacity), - oldValue.Transform is { } ? new ImmutableTransform(oldValue.Transform.Value) : null, + InterpolateTransform(progress, oldValue.Transform, newValue.Transform), s_relativePointAnimator.Interpolate(progress, oldValue.TransformOrigin, newValue.TransformOrigin), oldValue.SpreadMethod, s_relativePointAnimator.Interpolate(progress, oldLinear.StartPoint, newLinear.StartPoint), @@ -72,6 +73,25 @@ namespace Avalonia.Animation.Animators return control.Bind((AvaloniaProperty)Property, instance, BindingPriority.Animation); } + private static ImmutableTransform? InterpolateTransform(double progress, + ITransform? oldTransform, ITransform? newTransform) + { + if (oldTransform is TransformOperations oldTransformOperations + && newTransform is TransformOperations newTransformOperations) + { + + return new ImmutableTransform(TransformOperations + .Interpolate(oldTransformOperations, newTransformOperations, progress).Value); + } + + if (oldTransform is { }) + { + return new ImmutableTransform(oldTransform.Value); + } + + return null; + } + private static IReadOnlyList InterpolateStops(double progress, IReadOnlyList oldValue, IReadOnlyList newValue) { var resultCount = Math.Max(oldValue.Count, newValue.Count); From a4d94f62f4c61f674e65f9be4613596f630d4c4b Mon Sep 17 00:00:00 2001 From: Max Katz Date: Wed, 28 Dec 2022 18:30:21 -0800 Subject: [PATCH 2/2] Update src/Avalonia.Base/Animation/Animators/GradientBrushAnimator.cs --- src/Avalonia.Base/Animation/Animators/GradientBrushAnimator.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Avalonia.Base/Animation/Animators/GradientBrushAnimator.cs b/src/Avalonia.Base/Animation/Animators/GradientBrushAnimator.cs index 7da1b68051..801f247754 100644 --- a/src/Avalonia.Base/Animation/Animators/GradientBrushAnimator.cs +++ b/src/Avalonia.Base/Animation/Animators/GradientBrushAnimator.cs @@ -84,7 +84,7 @@ namespace Avalonia.Animation.Animators .Interpolate(oldTransformOperations, newTransformOperations, progress).Value); } - if (oldTransform is { }) + if (oldTransform is not null) { return new ImmutableTransform(oldTransform.Value); }