diff --git a/samples/RenderDemo/Pages/AnimationsPage.xaml b/samples/RenderDemo/Pages/AnimationsPage.xaml
index 3981f7b51b..9043bac33e 100644
--- a/samples/RenderDemo/Pages/AnimationsPage.xaml
+++ b/samples/RenderDemo/Pages/AnimationsPage.xaml
@@ -172,7 +172,7 @@
-
+
@@ -183,7 +183,7 @@
-
+
@@ -200,20 +200,31 @@
PlaybackDirection="Alternate">
-
+
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
@@ -226,16 +237,20 @@
-
+
+
-
+
-
+
+
+
+
@@ -247,10 +262,34 @@
+ PlaybackDirection="Normal">
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -258,9 +297,9 @@
-
-
-
+
+
+
diff --git a/src/Avalonia.Visuals/Animation/Animators/GradientBrushAnimator.cs b/src/Avalonia.Visuals/Animation/Animators/GradientBrushAnimator.cs
index 25b4a2826c..6481f815de 100644
--- a/src/Avalonia.Visuals/Animation/Animators/GradientBrushAnimator.cs
+++ b/src/Avalonia.Visuals/Animation/Animators/GradientBrushAnimator.cs
@@ -19,8 +19,7 @@ namespace Avalonia.Animation.Animators
public override IGradientBrush? Interpolate(double progress, IGradientBrush? oldValue, IGradientBrush? newValue)
{
- if (oldValue is null || newValue is null
- || oldValue.GradientStops.Count != newValue.GradientStops.Count)
+ if (oldValue is null || newValue is null)
{
return progress >= 0.5 ? newValue : oldValue;
}
@@ -64,13 +63,26 @@ namespace Avalonia.Animation.Animators
private IReadOnlyList InterpolateStops(double progress, IReadOnlyList oldValue, IReadOnlyList newValue)
{
- var stops = new ImmutableGradientStop[oldValue.Count];
- for (int index = 0; index < oldValue.Count; index++)
+ var resultCount = Math.Max(oldValue.Count, newValue.Count);
+ var stops = new ImmutableGradientStop[resultCount];
+
+ for (int index = 0, oldIndex = 0, newIndex = 0; index < resultCount; index++)
{
stops[index] = new ImmutableGradientStop(
- s_doubleAnimator.Interpolate(progress, oldValue[index].Offset, newValue[index].Offset),
- ColorAnimator.InterpolateCore(progress, oldValue[index].Color, newValue[index].Color));
+ s_doubleAnimator.Interpolate(progress, oldValue[oldIndex].Offset, newValue[newIndex].Offset),
+ ColorAnimator.InterpolateCore(progress, oldValue[oldIndex].Color, newValue[newIndex].Color));
+
+ if (oldIndex < oldValue.Count - 1)
+ {
+ oldIndex++;
+ }
+
+ if (newIndex < newValue.Count - 1)
+ {
+ newIndex++;
+ }
}
+
return stops;
}
@@ -80,29 +92,29 @@ namespace Avalonia.Animation.Animators
{
case IRadialGradientBrush oldRadial:
return new ImmutableRadialGradientBrush(
- CreateStopsFromSolidColorBrush(solidColorBrush, oldRadial), solidColorBrush.Opacity,
+ CreateStopsFromSolidColorBrush(solidColorBrush, oldRadial.GradientStops), solidColorBrush.Opacity,
oldRadial.SpreadMethod, oldRadial.Center, oldRadial.GradientOrigin, oldRadial.Radius);
case IConicGradientBrush oldConic:
return new ImmutableConicGradientBrush(
- CreateStopsFromSolidColorBrush(solidColorBrush, oldConic), solidColorBrush.Opacity,
+ CreateStopsFromSolidColorBrush(solidColorBrush, oldConic.GradientStops), solidColorBrush.Opacity,
oldConic.SpreadMethod, oldConic.Center, oldConic.Angle);
case ILinearGradientBrush oldLinear:
return new ImmutableLinearGradientBrush(
- CreateStopsFromSolidColorBrush(solidColorBrush, oldLinear), solidColorBrush.Opacity,
+ CreateStopsFromSolidColorBrush(solidColorBrush, oldLinear.GradientStops), solidColorBrush.Opacity,
oldLinear.SpreadMethod, oldLinear.StartPoint, oldLinear.EndPoint);
default:
throw new NotSupportedException($"Gradient of type {gradientBrush?.GetType()} is not supported");
}
- static IReadOnlyList CreateStopsFromSolidColorBrush(ISolidColorBrush solidColorBrush, IGradientBrush baseGradient)
+ static IReadOnlyList CreateStopsFromSolidColorBrush(ISolidColorBrush solidColorBrush, IReadOnlyList baseStops)
{
- var stops = new ImmutableGradientStop[baseGradient.GradientStops.Count];
- for (int index = 0; index < baseGradient.GradientStops.Count; index++)
+ var stops = new ImmutableGradientStop[baseStops.Count];
+ for (int index = 0; index < baseStops.Count; index++)
{
- stops[index] = new ImmutableGradientStop(baseGradient.GradientStops[index].Offset, solidColorBrush.Color);
+ stops[index] = new ImmutableGradientStop(baseStops[index].Offset, solidColorBrush.Color);
}
return stops;
}