WPF DoubleAnimationUsingKeyFrames пропуск кадров - PullRequest
0 голосов
/ 12 октября 2018

Я пытаюсь анимировать слайдер, используя DoubleAnimationUsingKeyFrames и DiscreteDoubleKeyFrame, чтобы анимировать слайдер для каждого ключевого кадра.Однако при воспроизведении раскадровки кажется, что кадры пропускаются, то есть событие ValueChanged срабатывает не для каждого ключевого кадра.Раскадровка и анимация настраиваются в выделенном коде следующим образом:

DoubleAnimationUsingKeyFrames _timelineAnimation = new DoubleAnimationUsingKeyFrames();
Storyboard _timelineStoryboard = new Storyboard();

void SetupTimeline()
{
    // set up timeline storyboard animation
    _timelineAnimation.SpeedRatio = 1.0;
    Storyboard.SetTarget(_timelineAnimation, timelineSlider);
    Storyboard.SetTargetProperty(_timelineAnimation, new PropertyPath(Slider.ValueProperty));
    _timelineStoryboard.Children.Add(_timelineAnimation);
    timelineSlider.ValueChanged += TimelineSlider_ValueChanged;
}

void StartTimeline(List<double> times)
{
    foreach (double time in times)
    {
        double value = time - timelineSlider.Value;
        var keyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(value));

        _timelineAnimation.KeyFrames.Add(new DiscreteDoubleKeyFrame(time, keyTime));
    }

    _timelineStoryboard.Begin(timelineSlider, true);
}

// this does not fire for every key frame
void TimelineSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
    Debug.Print($"TimelineSlider_ValueChanged {e.NewValue}");
}

Пример входных данных (в секундах):

136.224
136.238 
136.244 
136.2441
136.246
136.2461
136.264 
136.274 
136.294 
136.2941
136.296 
136.2961

Я полагаю, что проблема может заключаться в том, чтоэлементы данных находятся слишком близко друг к другу.Есть ли способ ускорить разрешение таймера анимации?Или какие-либо другие предложения относительно решения?

1 Ответ

0 голосов
/ 13 октября 2018

Фактически, когда интервал между двумя кадрами установлен ниже 30 миллисекунд или около того, некоторые кадры могут быть пропущены.

Это очень похоже на WPF DispatcherTimer.WPF DispatcherTimer, независимо от того, насколько мал его Интервал , тикает только один раз в каждые (около) 30 миллисекунд.

Чтобы создать эффект анимации, WPF использует менеджер времени для периодического оповещения об обновлении.Когда этот флажок установлен, анимированные свойства (в этом случае Value свойство Slider) переоцениваются и пользовательский интерфейс обновляется.И он, очевидно, выбирает «самый последний» кадр на временной шкале и отбрасывает те, которые уже устарели.

Менеджер времени «тикает» много раз в секунду;фактическое число тиков, возникающих каждую секунду, зависит от доступных системных ресурсов.

Даже если вам удастся ускорить таймер разрешения - я полагаю, что это невозможно для таймера пользовательского интерфейса, скажем, сделать его включенным каждую 1 миллисекунду, человеческие глаза не могут воспринимать такую ​​высокую частотув анимации, а мониторы отображаются с частотой только 50-60 Гц.

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