Browse Source

Merge pull request #10194 from workgroupengineering/perf/core/Animatable

perf: Animatable small adjust
pull/10202/head
Max Katz 4 years ago
committed by GitHub
parent
commit
2b697422a6
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 29
      src/Avalonia.Base/Animation/Animatable.cs

29
src/Avalonia.Base/Animation/Animatable.cs

@ -29,6 +29,9 @@ namespace Avalonia.Animation
private bool _transitionsEnabled = true; private bool _transitionsEnabled = true;
private bool _isSubscribedToTransitionsCollection = false; private bool _isSubscribedToTransitionsCollection = false;
private Dictionary<ITransition, TransitionState>? _transitionState; private Dictionary<ITransition, TransitionState>? _transitionState;
private NotifyCollectionChangedEventHandler? _collectionChanged;
private NotifyCollectionChangedEventHandler TransitionsCollectionChangedHandler =>
_collectionChanged ??= TransitionsCollectionChanged;
/// <summary> /// <summary>
/// Gets or sets the clock which controls the animations on the control. /// Gets or sets the clock which controls the animations on the control.
@ -61,14 +64,14 @@ namespace Avalonia.Animation
{ {
_transitionsEnabled = true; _transitionsEnabled = true;
if (Transitions is object) if (Transitions is Transitions transitions)
{ {
if (!_isSubscribedToTransitionsCollection) if (!_isSubscribedToTransitionsCollection)
{ {
_isSubscribedToTransitionsCollection = true; _isSubscribedToTransitionsCollection = true;
Transitions.CollectionChanged += TransitionsCollectionChanged; transitions.CollectionChanged += TransitionsCollectionChangedHandler;
} }
AddTransitions(Transitions); AddTransitions(transitions);
} }
} }
} }
@ -86,14 +89,14 @@ namespace Avalonia.Animation
{ {
_transitionsEnabled = false; _transitionsEnabled = false;
if (Transitions is object) if (Transitions is Transitions transitions)
{ {
if (_isSubscribedToTransitionsCollection) if (_isSubscribedToTransitionsCollection)
{ {
_isSubscribedToTransitionsCollection = false; _isSubscribedToTransitionsCollection = false;
Transitions.CollectionChanged -= TransitionsCollectionChanged; transitions.CollectionChanged -= TransitionsCollectionChangedHandler;
} }
RemoveTransitions(Transitions); RemoveTransitions(transitions);
} }
} }
} }
@ -120,7 +123,7 @@ namespace Avalonia.Animation
toAdd = newTransitions.Except(oldTransitions).ToList(); toAdd = newTransitions.Except(oldTransitions).ToList();
} }
newTransitions.CollectionChanged += TransitionsCollectionChanged; newTransitions.CollectionChanged += TransitionsCollectionChangedHandler;
_isSubscribedToTransitionsCollection = true; _isSubscribedToTransitionsCollection = true;
AddTransitions(toAdd); AddTransitions(toAdd);
} }
@ -134,19 +137,19 @@ namespace Avalonia.Animation
toRemove = oldTransitions.Except(newTransitions).ToList(); toRemove = oldTransitions.Except(newTransitions).ToList();
} }
oldTransitions.CollectionChanged -= TransitionsCollectionChanged; oldTransitions.CollectionChanged -= TransitionsCollectionChangedHandler;
RemoveTransitions(toRemove); RemoveTransitions(toRemove);
} }
} }
else if (_transitionsEnabled && else if (_transitionsEnabled &&
Transitions is object && Transitions is Transitions transitions &&
_transitionState is object && _transitionState is object &&
!change.Property.IsDirect && !change.Property.IsDirect &&
change.Priority > BindingPriority.Animation) change.Priority > BindingPriority.Animation)
{ {
for (var i = Transitions.Count -1; i >= 0; --i) for (var i = transitions.Count - 1; i >= 0; --i)
{ {
var transition = Transitions[i]; var transition = transitions[i];
if (transition.Property == change.Property && if (transition.Property == change.Property &&
_transitionState.TryGetValue(transition, out var state)) _transitionState.TryGetValue(transition, out var state))
@ -166,11 +169,11 @@ namespace Avalonia.Animation
{ {
oldValue = animatedValue; oldValue = animatedValue;
} }
var clock = Clock ?? AvaloniaLocator.Current.GetRequiredService<IGlobalClock>();
state.Instance?.Dispose(); state.Instance?.Dispose();
state.Instance = transition.Apply( state.Instance = transition.Apply(
this, this,
Clock ?? AvaloniaLocator.Current.GetRequiredService<IGlobalClock>(), clock,
oldValue, oldValue,
newValue); newValue);
return; return;

Loading…
Cancel
Save