Синхронизация анимации с использованием AnimationClock в WPF - PullRequest
0 голосов
/ 24 октября 2018

Я пытаюсь определить точное время начала и окончания анимации.Анимация запускается с использованием AnimationClock.Я попытался прослушать событие CurrentStateInvalidated объекта AnimationClock, но когда я проверяю время, прошедшее с момента вызова AnimationClock.Controller.Begin (), оно всегда меньше продолжительности анимации (30-50 мс).Анимация появляется, чтобы начать немедленно.Следующий пример кода должен продемонстрировать это.

public partial class AnimationTest : Window {
    private Stopwatch _stopwatch;
    private AnimationClock _clock;
    public ICommand StartCommand => new RelayCommand(Start);

    public AnimationTest() {
        InitializeComponent();
        _stopwatch = new Stopwatch();
        var a = CreateAnimation();
        _clock = a.CreateClock();
        MyRectangle.ApplyAnimationClock(MarginProperty, _clock);
        _clock.Controller.Stop();
        _clock.CurrentStateInvalidated += AnimationClock_CurrentStateInvalidated;
        DataContext = this;
    }

    private ThicknessAnimationUsingKeyFrames CreateAnimation() {
        ThicknessAnimationUsingKeyFrames a = new ThicknessAnimationUsingKeyFrames();
        var duration = 0;
        var durationPerKeyFrame = 400;
        a.KeyFrames.Add(new LinearThicknessKeyFrame(new Thickness(400, 300, 0, 0), TimeSpan.FromMilliseconds(duration += durationPerKeyFrame)));
        a.KeyFrames.Add(new LinearThicknessKeyFrame(new Thickness(0, 0, 0, 0), TimeSpan.FromMilliseconds(duration += durationPerKeyFrame)));
        a.Duration = TimeSpan.FromMilliseconds(duration);
        a.FillBehavior = FillBehavior.Stop;
        return a;
    }

    private void WindowLoaded(object sender, RoutedEventArgs e) {

    }
    private void Start() {
        _clock.Controller.Begin();
        _stopwatch.Start();
    }

    private void AnimationClock_CurrentStateInvalidated(object sender, EventArgs e) {
        Clock clock = (Clock) sender;
        if (clock.CurrentState == ClockState.Active) {
            Console.WriteLine("time since start was called " + _stopwatch.ElapsedMilliseconds + " ms");
            _stopwatch.Restart();
        }
        if (clock.CurrentState == ClockState.Stopped) {
            Console.WriteLine("time since animation started " + _stopwatch.ElapsedMilliseconds + " ms");
            _stopwatch.Reset();
        }          
    }
}

Я думаю, что либо анимация на самом деле короче указанной мной продолжительности, событие CurrentStateInvalidated вызывается до остановки анимации, либо происходит задержка, когдаанимация запускается, что вызывает задержку StopWatch.Restart ().Как я могу знать наверняка?

Анимация используется в качестве стимулов при записи данных отслеживания глаз, а также звука, поэтому мне нужно убедиться, что отслеживание глаз и аудиозапись начинаются в момент запуска анимации,или, по крайней мере, знаете, как следует настроить синхронизацию, чтобы ее можно было синхронизировать.Нужно ли искать для этого другие анимационные рамки, кроме WPF?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...