using Avalonia.Metadata; using System; using System.Reactive.Linq; using Avalonia.Animation.Easings; using Avalonia.Animation.Utils; using Avalonia.Reactive; namespace Avalonia.Animation { /// /// Handles the timing and lifetime of a . /// internal class TransitionInstance : SingleSubscriberObservableBase { private IDisposable _timerSubscription; private TimeSpan _duration; private readonly IClock _baseClock; private IClock _clock; public TransitionInstance(IClock clock, TimeSpan Duration) { _duration = Duration; _baseClock = clock; } private void TimerTick(TimeSpan t) { var interpVal = _duration.Ticks == 0 ? 1d : (double)t.Ticks / _duration.Ticks; // Clamp interpolation value. if (interpVal >= 1d | interpVal < 0d) { PublishNext(1d); PublishCompleted(); } else { PublishNext(interpVal); } } protected override void Unsubscribed() { _timerSubscription?.Dispose(); _clock.PlayState = PlayState.Stop; } protected override void Subscribed() { _clock = new Clock(_baseClock); _timerSubscription = _clock.Subscribe(TimerTick); PublishNext(0.0d); } } }