我正在尝试使用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
我认为问题可能出在数据项之间距离太近。有什么方法可以加快动画计时器的分辨率吗?或有关解决方案的其他建议?
答案 0 :(得分:1)
实际上,当两帧之间的间隔设置为小于30毫秒左右时,可能会跳过某些帧。
这很像WPF DispatcherTimer
。无论WPF Interval有多小,WPF DispatcherTimer
每30毫秒(约30毫秒)仅滴答一次。
为了产生动画效果,WPF使用time manager定期发出更新信号。勾选时,将重新评估动画属性(在本例中为Value
的{{1}}属性),并且更新了UI。显然,它会选择时间轴中的“最近”帧,并丢弃那些已经过时的帧。
时间管理器每秒“滴答”多次;每秒发生的滴答声的实际数量取决于可用的系统资源。
即使您设法加快分辨率计时器的速度-我想UI计时器也不可能,例如,使其每1毫秒滴答一次,人眼也无法感知动画中如此高的频率,并且,监视器的显示频率仅为50-60 Hz。