Skip to content

Commit

Permalink
Merge pull request AvaloniaUI#7658 from trympet/7657-fix-brush-opacit…
Browse files Browse the repository at this point in the history
…y-animation

fix brush opacity animation
  • Loading branch information
maxkatz6 authored and danwalmsley committed Feb 21, 2022
1 parent d535960 commit 5b4f5da
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,18 @@ namespace Avalonia.Animation.Animators
/// </summary>
public class ISolidColorBrushAnimator : Animator<ISolidColorBrush?>
{
private static readonly DoubleAnimator s_doubleAnimator = new DoubleAnimator();

public override ISolidColorBrush? Interpolate(double progress, ISolidColorBrush? oldValue, ISolidColorBrush? newValue)
{
if (oldValue is null || newValue is null)
{
return progress >= 0.5 ? newValue : oldValue;
}

return new ImmutableSolidColorBrush(ColorAnimator.InterpolateCore(progress, oldValue.Color, newValue.Color));
return new ImmutableSolidColorBrush(
ColorAnimator.InterpolateCore(progress, oldValue.Color, newValue.Color),
s_doubleAnimator.Interpolate(progress, oldValue.Opacity, newValue.Opacity));
}

public override IDisposable BindAnimation(Animatable control, IObservable<ISolidColorBrush?> instance)
Expand Down
54 changes: 54 additions & 0 deletions tests/Avalonia.Animation.UnitTests/BrushTransitionTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Avalonia.Controls;
using Avalonia.Media;
using Xunit;

namespace Avalonia.Animation.UnitTests
{
public class BrushTransitionTests
{
[Fact]
public void SolidColorBrush_Opacity_IsInteroplated()
{
Test(0, new SolidColorBrush { Opacity = 0 }, new SolidColorBrush { Opacity = 0 });
Test(0, new SolidColorBrush { Opacity = 0 }, new SolidColorBrush { Opacity = 1 });
Test(0.5, new SolidColorBrush { Opacity = 0 }, new SolidColorBrush { Opacity = 1 });
Test(0.5, new SolidColorBrush { Opacity = 0.5 }, new SolidColorBrush { Opacity = 0.5 });
Test(1, new SolidColorBrush { Opacity = 1 }, new SolidColorBrush { Opacity = 1 });
// TODO: investigate why this case fails.
//Test2(1, new SolidColorBrush { Opacity = 0 }, new SolidColorBrush { Opacity = 1 });
}

[Fact]
public void LinearGradientBrush_Opacity_IsInteroplated()
{
Test(0, new LinearGradientBrush { Opacity = 0 }, new LinearGradientBrush { Opacity = 0 });
Test(0, new LinearGradientBrush { Opacity = 0 }, new LinearGradientBrush { Opacity = 1 });
Test(0.5, new LinearGradientBrush { Opacity = 0 }, new LinearGradientBrush { Opacity = 1 });
Test(0.5, new LinearGradientBrush { Opacity = 0.5 }, new LinearGradientBrush { Opacity = 0.5 });
Test(1, new LinearGradientBrush { Opacity = 1 }, new LinearGradientBrush { Opacity = 1 });
}

private static void Test(double progress, IBrush oldBrush, IBrush newBrush)
{
var clock = new TestClock();
var border = new Border() { Background = oldBrush };
BrushTransition sut = new BrushTransition
{
Duration = TimeSpan.FromSeconds(1),
Property = Border.BackgroundProperty
};

sut.Apply(border, clock, oldBrush, newBrush);
clock.Pulse(TimeSpan.Zero);
clock.Pulse(sut.Duration * progress);

Assert.NotNull(border.Background);
Assert.Equal(oldBrush.Opacity + (newBrush.Opacity - oldBrush.Opacity) * progress, border.Background.Opacity);
}
}
}

0 comments on commit 5b4f5da

Please sign in to comment.