免费活动策划方案的网站,怎么增加网站的权重,南京今天的最新消息,广告装饰公司名称大全原文:WPF中的动画——#xff08;一#xff09;基本概念WPF的一个特点就是支持动画#xff0c;我们可以非常容易的实现漂亮大方的界面。首先#xff0c;我们来复习一下动画的基本概念。计算机中的动画一般是定格动画#xff0c;也称之为逐帧动画#xff0c;它通过每帧不同…原文:WPF中的动画——一基本概念 WPF的一个特点就是支持动画我们可以非常容易的实现漂亮大方的界面。首先我们来复习一下动画的基本概念。计算机中的动画一般是定格动画也称之为逐帧动画它通过每帧不同的图像连续播放从而欺骗眼和脑产生动画效果。其原理在维基百科上有比较详尽的解释这里就不多介绍了。 也就是说我们要产生动画只需要连续刷新界面即可。例如我们要实现一个宽度变化的按钮的动画可以用如下方式来实现 private void MainWindow_Loaded(object sender, RoutedEventArgs e) { var timer new System.Windows.Threading.DispatcherTimer(); timer.Tick new EventHandler(OnTimedEvent); timer.Interval TimeSpan.FromSeconds(1.0 / 20); timer.Start(); } int index 0; private void OnTimedEvent(object sender, EventArgs e) { index; if (index 40) index 0; button.Width 8 * (index); } 这段代码不难理解就是每隔1/20秒更新一次按钮的宽度在2s内将其高度从0变为320重复播放。 这段代码虽然实现了动画效果但它是通过计时器更新的传统做法在WinForm下也能实现。在WPF中正统的实现动画方式为 private void MainWindow_Loaded(object sender, RoutedEventArgs e) { var widthAnimation new DoubleAnimation() { From 0, To 320, Duration TimeSpan.FromSeconds(2), RepeatBehavior RepeatBehavior.Forever, }; button.BeginAnimation(WidthProperty, widthAnimation); } 相比较而言WPF的动画的实现方式有如下优点 一、简洁 这个是非常明显的WPF的动画的代码非常容易理解Timer的版本则要难懂得多。当然我们也可以通过封装使得用Timer也能用类似的API实现动画。但动画的API并不是仅仅这么一点要把整个动画框架的API都封装也没有那么容易。 二、和XAML无缝集成 这个就是WPF的独有技术了得益于XAML强大的表述能力我们可以写出非常强大且容易维护的动画。这里就不举例了后续文章中再做介绍这点WinFom的Timer版本是无法做到的。 三、流畅性 如果将这两种实现方式一起跑起来比较一下就会发现Timer实现的版本明显要卡顿并且并没有精准的按照我们设计的那样运动。具体原因为 Timer精度的问题由于是改UI控件的属性按钮的宽度因此必须在UI线程上进行因此DispatcherTimer 操作与其他操作一样需要放置到 Dispatcher 队列中它并不保证恰好在改时间间隔中。它并不适合动画这种间隔很短的计时。 帧率的问题逐帧动画的流畅性一般取决于每秒更新的帧数也就是常说的帧率。人眼睛上限是70帧而我这里代码中的Timer的固定了为20帧因此是能明显感觉到卡顿的。而WPF的动画则不然从它的API中可以看到它是没有帧率的设置的。实际上它是根据计算机的性能和当前进程的繁忙程度尽可能增大帧率的因此WPF的动画是远大于20帧的因此要流畅得多。 那么是否只要修改参数加大Timer的版本的帧率也可以实现同样流畅的动画呢 试了一下就算修改参数也是无法达到WPF版本的流畅程度的。我认为原因主要有如下两点 DispatcherTimer精度不够无法实现大帧率下准确刷新。通过简单的设置参数很难像WPF那样帧率根据计算机的性能和当前进程的繁忙程度智能匹配帧率。帧率设置过低动画不流畅设置过大处理不过来仍然不流畅。并且UI线程的忙碌程度是会动态变化的帧率也需要相应调整这些都无法通过Timer来简单的处理。 总之通过Timer定时更新的方式并不适合用来实现动画。因此还是有必要学习一下WPF的动画框架的后面我将陆续写一系列文章进行一些简单的介绍。如果要系统的学习建议参看以下微软的官方文档 http://msdn.microsoft.com/zh-cn/library/ms752312(vvs.110).aspx