Browse Source

Attempt to make Color animations work

pull/2163/head
Jumar Macato 7 years ago
parent
commit
d4355adb70
No known key found for this signature in database GPG Key ID: B19884DAC3A5BF3F
  1. 1
      samples/RenderDemo/Pages/AnimationsPage.xaml
  2. 4
      src/Avalonia.Visuals/Animation/Animators/ColorAnimator.cs
  3. 69
      src/Avalonia.Visuals/Animation/Animators/SolidColorBrushAnimator.cs
  4. 3
      src/Avalonia.Visuals/Media/Brush.cs
  5. 4
      src/Avalonia.Visuals/Media/Color.cs
  6. 3
      src/Avalonia.Visuals/Media/SolidColorBrush.cs

1
samples/RenderDemo/Pages/AnimationsPage.xaml

@ -87,6 +87,7 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Animation Duration="0:0:3" Easing="BounceEaseInOut">
<KeyFrame Cue="48%">
<Setter Property="TranslateTransform.Y" Value="-100"/>
<Setter Property="Background" Value="Magenta"/>
</KeyFrame>
</Animation>
</Style.Animations>

4
src/Avalonia.Visuals/Animation/Animators/ColorAnimator.cs

@ -1,7 +1,8 @@
// Original source was written by Romain Guy and Francois Blavoet
// Original color interpolation code was written by Romain Guy and Francois Blavoet
// and adopted from LottieSharp Project (https://github.com/ascora/LottieSharp).
using System;
using System.Reactive.Disposables;
using Avalonia.Logging;
using Avalonia.Media;
@ -45,7 +46,6 @@ namespace Avalonia.Animation.Animators
oldR = EOCF_sRGB(oldR);
oldG = EOCF_sRGB(oldG);
oldB = EOCF_sRGB(oldB);
newR = EOCF_sRGB(newR);
newG = EOCF_sRGB(newG);
newB = EOCF_sRGB(newB);

69
src/Avalonia.Visuals/Animation/Animators/SolidColorBrushAnimator.cs

@ -0,0 +1,69 @@
using System;
using System.Reactive.Disposables;
using Avalonia.Logging;
using Avalonia.Media;
using Avalonia.Media.Immutable;
namespace Avalonia.Animation.Animators
{
/// <summary>
/// Animator that interpolates <see cref="Color"/> through
/// gamma sRGB color space for better visual result.
/// </summary>
public class SolidColorBrushAnimator : Animator<SolidColorBrush>
{
ColorAnimator colorAnimator;
void InitializeColorAnimator()
{
colorAnimator = new ColorAnimator();
foreach (AnimatorKeyFrame keyframe in this)
{
colorAnimator.Add(keyframe);
}
}
public override IDisposable Apply(Animation animation, Animatable control, IClock clock, IObservable<bool> match, Action onComplete)
{
var ctrl = (Visual)control;
foreach (var keyframe in this)
{
if (keyframe.Value as ISolidColorBrush == null)
return Disposable.Empty;
}
if (control.GetValue(Property) == null)
control.SetValue(Property, new SolidColorBrush(Colors.Transparent));
var targetVal = control.GetValue(Property);
if (typeof(ISolidColorBrush).IsAssignableFrom(targetVal.GetType()))
{
if (colorAnimator == null)
InitializeColorAnimator();
SolidColorBrush finalTarget = new SolidColorBrush();
if (targetVal.GetType() == typeof(ImmutableSolidColorBrush))
{
var k = (ImmutableSolidColorBrush)targetVal;
finalTarget.Color = k.Color;
}
else
{
finalTarget = targetVal as SolidColorBrush;
}
colorAnimator.Property = SolidColorBrush.ColorProperty;
return colorAnimator.Apply(animation, finalTarget, clock ?? control.Clock, match, onComplete);
}
return Disposable.Empty;
}
public override SolidColorBrush Interpolate(double p, SolidColorBrush o, SolidColorBrush n) => null;
}
}

3
src/Avalonia.Visuals/Media/Brush.cs

@ -3,6 +3,7 @@
using System;
using System.ComponentModel;
using Avalonia.Animation;
namespace Avalonia.Media
{
@ -10,7 +11,7 @@ namespace Avalonia.Media
/// Describes how an area is painted.
/// </summary>
[TypeConverter(typeof(BrushConverter))]
public abstract class Brush : AvaloniaObject, IMutableBrush
public abstract class Brush : Animatable, IMutableBrush
{
/// <summary>
/// Defines the <see cref="Opacity"/> property.

4
src/Avalonia.Visuals/Media/Color.cs

@ -15,9 +15,9 @@ namespace Avalonia.Media
{
static Color()
{
Animation.Animation.RegisterAnimator<ColorAnimator>(prop => typeof(IBrush).IsAssignableFrom(prop.PropertyType));
Animation.Animation.RegisterAnimator<ColorAnimator>(prop => typeof(Color).IsAssignableFrom(prop.PropertyType));
}
/// <summary>
/// Gets or sets the Alpha component of the color.
/// </summary>

3
src/Avalonia.Visuals/Media/SolidColorBrush.cs

@ -1,6 +1,8 @@
// 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.
using Avalonia.Animation;
using Avalonia.Animation.Animators;
using Avalonia.Media.Immutable;
namespace Avalonia.Media
@ -18,6 +20,7 @@ namespace Avalonia.Media
static SolidColorBrush()
{
Animation.Animation.RegisterAnimator<SolidColorBrushAnimator>(prop => typeof(IBrush).IsAssignableFrom(prop.PropertyType));
AffectsRender<SolidColorBrush>(ColorProperty);
}

Loading…
Cancel
Save