Я пытаюсь определить точное время начала и окончания анимации.Анимация запускается с использованием 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?