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(v=vs.110).aspx
WPF中的动画——(一)基本概念相关推荐
- 【WPF学习笔记】[转]周银辉之WPF中的动画 晓风影天之wpf动画——new PropertyPath属性链...
(一)WPF中的动画 动画无疑是WPF中最吸引人的特色之一,其可以像Flash一样平滑地播放并与程序逻辑进行很好的交互.这里我们讨论一下故事板. 在WPF中我们采用Storyboard(故事板)的方式 ...
- WPF中的动画——(二)From/To/By 动画
原文:WPF中的动画--(二)From/To/By 动画 我们所实现的的动画中,很大一部分是让一个属性在起始值和结束值之间变化,例如,我在前文中实现的改变宽度的动画: var widthAnimati ...
- WPF中的动画——(二)From/To/By 动画(二)
WPF中的动画--(二)From/To/By 动画 我们所实现的的动画中,很大一部分是让一个属性在起始值和结束值之间变化,例如,我在前文中实现的改变宽度的动画: var widthAnimation ...
- WPF中的动画——(三)时间线(TimeLine)
WPF中的动画--(三)时间线(TimeLine) 原文:WPF中的动画--(三)时间线(TimeLine) 时间线(TimeLine)表示时间段. 它提供的属性可以让控制该时间段的长度.开始时间.重 ...
- WPF中的动画——(六)演示图板
前面所介绍的都是单一的动画,它只能修改单一属性.有的时候,我们需要将一组动画一起进行,对于一个按钮,我们可能有如下需求: 选择该按钮时,该按钮增大并更改颜色. 单击该按钮时,该按钮缩小并恢复其原始大小 ...
- WPF中的动画——(五)路径动画
路径动画是一种专门用于将对象按照指定的Path移动的动画,虽然我们也可以通过控制动画的旋转和偏移实现对象的移动,但路径动画更专业,它的实现更加简洁明了. 路径动画中最常用的是MatrixAnimati ...
- WPF中的动画——(四)缓动函数
缓动函数可以通过一系列公式模拟一些物理效果,如实地弹跳或其行为如同在弹簧上一样.它们一般应用在From/To/By动画上,可以使得其动画更加平滑. var widthAnimation = new D ...
- WPF中的树:LogicalTree、VisualTree
WPF 中的树 逻辑树LogicalTree 逻辑树是在WPF框架级别定义的,这意味着与逻辑树操作最相关的WPF基本元素是FrameworkElement或FrameworkContentElemen ...
- WPF中自动增加行(动画)的TextBox
WPF中自动增加行(动画)的TextBox 原文:WPF中自动增加行(动画)的TextBox WPF中自动增加行(动画)的TextBox WPF中的Textbox控件是可以自动换行的,只要设置Text ...
最新文章
- msql查询指定日期
- Java 7之集合类型 - 二叉排序树、平衡树、红黑树---转
- Redis中的Sentinel故障转移
- php sodium 加密解密,sodium库(加密)
- 数学知识总结——矩阵
- 全局使用dva dispatch
- PHP工厂模式计算面积与周长
- 让我们一起Go(九)
- 数据库-临时表和复制表
- elasticsearch6 php,elasticsearch 6.x php-client
- 那些属于我自己的牢骚
- Elasticsearch辅助插件安装
- 我是太阳因为自信才会把你照亮—2015许小乖的IT之路
- 空气净化器上亚马逊需要提交UL867测试报告
- 腾讯安全发布《2020年上半年手机安全报告》,揭示手机安全四大趋势
- gb和gib的区别_KB/KiB,MB/MiB,GB/GiB,它们有区别吗?
- 概率论与数理统计---随机事件及其概率(一)
- Pandas —— resample()重采样和asfreq()频度转换
- 【中级软考—软件设计师】2操作系统2.3进程调度【****】:2.3.3考点三:前趋图与PV操作
- 程序员述说阿里HR的恐怖:晚上11点接到面试电话
热门文章
- linux文件存储、inode、硬链接、软链接
- C++11 std::shared_ptr的std::move()移动语义底层分析
- nextcloud+nginx+mysql,Ubuntu搭建Nginx-Nextcloud环境
- 处理机流水线------经典五段流水线
- linux操作系统之条件变量
- linux gcc 简单使用记录01
- 详解优先级队列priority_queue(应用+模拟实现)
- 将字符串中的空格用%20替换
- 双向带环带头结点的链表实现栈
- lseek函数的使用