WPF中的动画——(一)基本概念() WPF中的动画——(一)基本概念

WPF的一个特色就是支持动画,咱们能够很是容易的实现漂亮大方的界面。首先,咱们来复习一下动画的基本概念。计算机中的动画通常是定格动画,也称之为逐帧动画,它经过每帧不一样的图像连续播放,从而欺骗眼和脑产生动画效果。其原理在维基百科上有比较详尽的解释,这里就很少介绍了。html

也就是说,咱们要产生动画,只须要连续刷新界面便可。例如,咱们要实现一个宽度变化的按钮的动画,能够用以下方式来实现:框架

    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++);
    } post

这段代码不难理解,就是每隔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的动画的实现方式有以下优势:url

1、简洁spa

这个是很是明显的,WPF的动画的代码很是容易理解,Timer的版本则要难懂得多。固然,咱们也能够经过封装,使得用Timer也能用相似的API实现动画。但动画的API并非仅仅这么一点,要把整个动画框架的API都封装也没有那么容易。线程

2、和XAML无缝集成设计

这个就是WPF的独有技术了,得益于XAML强大的表述能力,咱们能够写出很是强大且容易维护的动画。(这里就不举例了,后续文章中再作介绍)这点WinFom的Timer版本是没法作到的。

3、流畅性

若是将这两种实现方式一块儿跑起来比较一下就会发现,Timer实现的版本明显要卡顿,而且并无精准的按照咱们设计的那样运动。具体缘由为:

Timer精度的问题:因为是改UI控件的属性(按钮的宽度),所以必须在UI线程上进行,所以DispatcherTimer 操做与其余操做同样须要放置到 Dispatcher 队列中,它并不保证刚好在改时间间隔中。它并不适合动画这种间隔很短的计时。

帧率的问题:逐帧动画的流畅性通常取决于每秒更新的帧数,也就是常说的帧率。人眼睛上限是70帧,而我这里代码中的Timer的固定了为20帧,所以是能明显感受到卡顿的。而WPF的动画则否则,从它的API中能够看到,它是没有帧率的设置的。实际上,它是根据计算机的性能和当前进程的繁忙程度尽量增大帧率的,所以WPF的动画是远大于20帧的,所以要流畅得多。

那么,是否只要修改参数,加大Timer的版本的帧率,也能够实现一样流畅的动画呢? 试了一下,就算修改参数,也是没法达到WPF版本的流畅程度的。我认为缘由主要有以下两点,

  1. DispatcherTimer精度不够,没法实现大帧率下准确刷新。
  2. 经过简单的设置参数很难像WPF那样帧率根据计算机的性能和当前进程的繁忙程度智能匹配帧率。帧率设置太低,动画不流畅,设置过大,处理不过来仍然不流畅。而且UI线程的忙碌程度是会动态变化的,帧率也须要相应调整,这些都没法经过Timer来简单的处理。

总之,经过Timer定时更新的方式并不适合用来实现动画。所以仍是有必要学习一下WPF的动画框架的,后面我将陆续写一系列文章进行一些简单的介绍。若是要系统的学习,建议参看如下微软的官方文档: http://msdn.microsoft.com/zh-cn/library/ms752312(v=vs.110).aspx

相关文章
相关标签/搜索