From a521f7d8609e228968f6b66adc094f0f484b892f Mon Sep 17 00:00:00 2001 From: IconHHw <138437673+IconHHw@users.noreply.github.com> Date: Tue, 25 Aug 2026 12:24:50 +0000 Subject: [PATCH] refactor(animation): use built-in float.Lerp/double.Lerp in transitions (#22043) Replace hand-written linear interpolation formulas with the framework Lerp helpers across animation code and the composition expression FFI. --- .../Pages/TabbedPage/FluidNavBar/FluidNavBar.cs | 2 +- .../Pages/Transitions/CardStackPageTransition.cs | 6 ++---- src/Avalonia.Base/Animation/CrossFade.cs | 6 ++---- .../Animation/Transitions/Rotate3DTransition.cs | 6 ++---- .../Rendering/Composition/Animations/Interpolators.cs | 2 +- .../Composition/Expressions/BuiltInExpressionFfi.cs | 4 ++-- 6 files changed, 10 insertions(+), 16 deletions(-) diff --git a/samples/ControlCatalog/Pages/TabbedPage/FluidNavBar/FluidNavBar.cs b/samples/ControlCatalog/Pages/TabbedPage/FluidNavBar/FluidNavBar.cs index a68e57c9a4..84a3900b18 100644 --- a/samples/ControlCatalog/Pages/TabbedPage/FluidNavBar/FluidNavBar.cs +++ b/samples/ControlCatalog/Pages/TabbedPage/FluidNavBar/FluidNavBar.cs @@ -604,7 +604,7 @@ namespace ControlCatalog.Pages while (measure.NextContour()); } - private static float Lerp(float a, float b, float t) => a + (b - a) * t; + private static float Lerp(float a, float b, float t) => float.Lerp(a, b, t); private static double LinearPoint(double x, double pIn, double pOut) { diff --git a/samples/ControlCatalog/Pages/Transitions/CardStackPageTransition.cs b/samples/ControlCatalog/Pages/Transitions/CardStackPageTransition.cs index 89ae1e5e8a..c036f0a5b3 100644 --- a/samples/ControlCatalog/Pages/Transitions/CardStackPageTransition.cs +++ b/samples/ControlCatalog/Pages/Transitions/CardStackPageTransition.cs @@ -424,10 +424,8 @@ public class CardStackPageTransition : PageSlide return sign * FarPeekAngle; } - private static double Lerp(double from, double to, double t) - { - return from + ((to - from) * Math.Clamp(t, 0.0, 1.0)); - } + private static double Lerp(double from, double to, double t) => + double.Lerp(from, to, Math.Clamp(t, 0.0, 1.0)); private static int GetViewportZIndex(double offsetFromCenter, Visual visual, Visual? from, Visual? to) { diff --git a/src/Avalonia.Base/Animation/CrossFade.cs b/src/Avalonia.Base/Animation/CrossFade.cs index 45a4300e5b..33641e4edc 100644 --- a/src/Avalonia.Base/Animation/CrossFade.cs +++ b/src/Avalonia.Base/Animation/CrossFade.cs @@ -260,9 +260,7 @@ namespace Avalonia.Animation return FarPeekOpacity; } - private static double Lerp(double from, double to, double t) - { - return from + ((to - from) * Math.Clamp(t, 0.0, 1.0)); - } + private static double Lerp(double from, double to, double t) => + double.Lerp(from, to, Math.Clamp(t, 0.0, 1.0)); } } diff --git a/src/Avalonia.Base/Animation/Transitions/Rotate3DTransition.cs b/src/Avalonia.Base/Animation/Transitions/Rotate3DTransition.cs index 41aa205547..38e4a46dc9 100644 --- a/src/Avalonia.Base/Animation/Transitions/Rotate3DTransition.cs +++ b/src/Avalonia.Base/Animation/Transitions/Rotate3DTransition.cs @@ -244,10 +244,8 @@ public class Rotate3DTransition : PageSlide return 1; } - private static double Lerp(double from, double to, double t) - { - return from + ((to - from) * Math.Clamp(t, 0.0, 1.0)); - } + private static double Lerp(double from, double to, double t) => + double.Lerp(from, to, Math.Clamp(t, 0.0, 1.0)); /// public override void Reset(Visual visual) diff --git a/src/Avalonia.Base/Rendering/Composition/Animations/Interpolators.cs b/src/Avalonia.Base/Rendering/Composition/Animations/Interpolators.cs index f801bd1c66..47e1972a12 100644 --- a/src/Avalonia.Base/Rendering/Composition/Animations/Interpolators.cs +++ b/src/Avalonia.Base/Rendering/Composition/Animations/Interpolators.cs @@ -77,7 +77,7 @@ namespace Avalonia.Rendering.Composition.Animations class ColorInterpolator : IInterpolator { - static byte Lerp(float a, float b, float p) => (byte) Math.Max(0, Math.Min(255, (p * (b - a) + a))); + static byte Lerp(float a, float b, float p) => (byte)Math.Clamp(float.Lerp(a, b, p), 0, 255); public static Avalonia.Media.Color LerpRGB(Avalonia.Media.Color to, Avalonia.Media.Color from, float progress) => diff --git a/src/Avalonia.Base/Rendering/Composition/Expressions/BuiltInExpressionFfi.cs b/src/Avalonia.Base/Rendering/Composition/Expressions/BuiltInExpressionFfi.cs index 4f6ac03971..a3ee451f80 100644 --- a/src/Avalonia.Base/Rendering/Composition/Expressions/BuiltInExpressionFfi.cs +++ b/src/Avalonia.Base/Rendering/Composition/Expressions/BuiltInExpressionFfi.cs @@ -13,8 +13,8 @@ namespace Avalonia.Rendering.Composition.Expressions { private readonly DelegateExpressionFfi _registry; - static float Lerp(float a, float b, float p) => p * (b - a) + a; - static double Lerp(double a, double b, double p) => p * (b - a) + a; + static float Lerp(float a, float b, float p) => float.Lerp(a, b, p); + static double Lerp(double a, double b, double p) => double.Lerp(a, b, p); static Matrix3x2 Inverse(Matrix3x2 m) {