【问题标题】:WPF DoubleAnimationUsingKeyFrames skipping framesWPF DoubleAnimationUsingKeyFrames 跳帧
【发布时间】:2018-10-14 08:53:51
【问题描述】:

我正在尝试使用DoubleAnimationUsingKeyFramesDiscreteDoubleKeyFrame 为滑块设置动画,以便为每个关键帧设置滑块的动画。但是,播放情节提要时似乎在跳帧,即 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

我想问题可能是数据项靠得太近了。有什么办法可以加快动画计时器的分辨率?或者关于解决方案的任何其他建议?

【问题讨论】:

    标签: c# wpf animation


    【解决方案1】:

    实际上,当两帧之间的间隔设置为低于 30 毫秒左右时,可能会跳过一些帧。

    这很像 WPF DispatcherTimer。 WPF DispatcherTimer,不管它的Interval 有多小,每(大约)30 毫秒只滴答一次。

    为了产生动画效果,WPF 使用time manager 定期发出更新信号。当它滴答作响时,动画属性(在本例中为SliderValue 属性)被重新评估并更新UI。它显然会选择时间轴中的“最新”帧并丢弃那些已经过时的帧。

    时间管理器每秒“滴答”很多次;每秒发生的实际滴答数取决于可用的系统资源。

    即使您设法加快分辨率计时器 - 我想 UI 计时器是不可能的,比如让它每 1 毫秒滴答一次,人眼无法感知动画中如此高的频率,而且,显示器的显示频率仅为 50-60 Hz。

    【讨论】:

    • 感谢您的回答。关于我所期望的情况。我试图使用动画来处理一系列不同的事件,这些事件通过充当时间线的滑块驱动仪表板显示。重要的是不要丢弃任何事件。我将不得不使用像 Reactive 这样的东西来驱动时间线。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多