在许多用户框架中(特别是WPF之前的框架,如Windows窗体和MFC),开发人员必须从头构建自己的动画系统。最常用的技术是结合使用计时器和一些自定义的绘图逻辑。WPF通过自带的基于属性的动画系统,改变了这种情况。接下来的两节将描述这两者之间的区别。

一、基于时间的动画

  假如需要旋转Windows窗体应用程序中的About对话框中的一块文本。下面是构建该解决方案的传统方法:

  (1)创建周期性触发的计时器(例如,每隔50毫秒触发一次)。

  (2)当触发计时器时,使用事件处理程序计算一些与动画相关的细节,如新的旋转角度。然后使窗口的一部分或者整个窗口无效。

  (3)不久后,Windows将要求窗口重新绘制自身,触发自定义的绘图代码。

  (4)在自定义的绘图代码中,渲染旋转后的文本。

  尽管这个基于计时器的解决方案不难实现,但将它继承到普通的应用程序窗口中却非常麻烦。下面是列出这种解决方案存在的一些问题:

  •   绘制像素而不是控件。为旋转Windows窗体中的文本,需要低级的GDI+绘图支持。GDI+易于使用,但却不能与普通的窗口元素(如按钮、文本框和标签等)很好地相互协调。所以需要将动画内容二环控件相互分离,并且不能在动画中包含任何用户交互元素。将无法旋转按钮。
  •   假定单一动画。如果决定希望同时运行两个动画,就需要重新编写所有动画代码——并且变得更复杂。在这方面WPF显得更加强大,它可以构建比单一简单动画更复杂的动画。
  •   动画帧率是固定的。计时器设置完全决定了帧率。如果改变时间间隔,可能需要修改动画代码(取决于执行计算的方式)。而且,选择的固定帧率对于特定的计算机显卡硬件不一定理想。
  •   复杂动画需要指数级增长的更复杂的代码。旋转文本的示例非常简单,但如果想沿着一定路径移动比较小的矢量图画,就困难得多了。在WPF中,甚至是复杂的动画也能够在XAML中定义(而且可以使用第三方设计工具生成动画)。

  基于计时器的动画仍存在一些缺点:导致代码不是很灵活,对于复杂的效果会变得杂乱无章,并且不鞥能得到最佳性能。

二、基于属性的动画

  WPF提供了一个更高级的模型,通过该模型可以只关注动画的定义,而不必考虑它们的渲染方式。这个模型基于依赖项属性基础架构。本质上,WPF动画只不过是在一定时间间隔内修改依赖项属性值得一种方式。

  例如,为了增大或缩小按钮,可以在动画中修改按钮的宽度。为使按钮闪烁,可修改用于按钮背景的LinearGradientBrush画刷的属性。创建正确动画的秘密在于决定需要修改什么属性。

  如果希望实现不能通过修改属性实现的其他变化,上述方法就行不通。例如,不能将添加或删除元素作为动画的一部分。同样,不要求WPF在开始场景和结束场景之间执行过渡(尽管一些灵活的变通方法可以模拟这种效果)。最后,只能依赖项属性应用动画,因为只有依赖项属性应用动画,因为只有依赖项属性使用动态的属性识别系统,而该系统将动画考虑在内。

  乍一看,WPF动画关注属性的本质看起来有很大的局限性。然而,当使用WPF进行工作时,就会发现它的功能非常强大。实际上,使用每个元素都支持的公共属性可以实现非常多得动画效果。

  但许多情况下,基于属性的动画系统不能工作。作为经验法则,基于属性的动画系统是为普通的Windows应用程序添加动态的极佳方式。例如,如果希望润色交互性购物工具的前端,基于属性的动画系统将会很完美地工作。然而,如果需要作为应用程序的核心目标苏菲使用动画,并且希望动画在应用程序的整个生命周期中持续运行,可能需要更灵活的、更强大的技术。例如,如果正在创建基本游戏或为模型碰撞使用复杂的物理计算,就需要更好地控制动画。

  

【WPF学习】第四十八章 理解WPF动画的更多相关文章

  1. 【WPF学习】第二十八章 程序集资源

    WPF应用程序中的程序集资源与其他.NET应用程序中的程序集资源在本质上是相同的.基本概念是为项目添加文件,从而Visual studio可将其嵌入到编译过的应用程序的EXE或DLL文件中.WPF程序 ...

  2. 【WPF学习】第十八章 多点触控输入

    多点触控(multi-touch)是通过触摸屏幕与应用程序进行交互的一种方式.多点触控输入和更传统的基于笔(pen-based)的输入的区别是多点触控识别手势(gesture)——用户可移动多根手指以 ...

  3. 【WPF学习】第十五章 WPF事件

    前两章学习了WPF事件的工作原理,现在分析一下在代码中可以处理的各类事件.尽管每个元素都提供了许多事件,但最重要的事件通常包括以下5类: 生命周期事件:在元素被初始化.加载或卸载时发生这些事件. 鼠标 ...

  4. “全栈2019”Java第四十八章:重写方法Override

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  5. Gradle 1.12用户指南翻译——第四十八章. Wrapper 插件

    本文由CSDN博客貌似掉线翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...

  6. 【WPF学习】第二十六章 Application类——应用程序的生命周期

    在WPF中,应用程序会经历简单的生命周期.在应用程序启动后,将立即创建应用程序对象,在应用程序运行时触发各种应用程序事件,你可以选择监视其中的某些事件.最后,当释放应用程序对象时,应用程序将结束. 一 ...

  7. 【WPF学习】第五十八章 理解逻辑树和可视化树

    在前面章节中,花费大量时间分析了窗口的内容模型——换句话说,研究了如何在其他元素中嵌套元素,进而构建完整的窗口. 例如,考虑下图中显示的一个非常简单的窗口,该窗口包含两个按钮.为创建该按钮,在窗口中嵌 ...

  8. 【WPF学习】第四十九章 基本动画

    在前一章已经学习过WPF动画的第一条规则——每个动画依赖于一个依赖项属性.然而,还有另一个限制.为了实现属性的动态化(换句话说,使用基于时间的方式改变属性的值),需要有支持相应数据类型的动画类.例如, ...

  9. 【WPF学习】第十四章 事件路由

    由上一章可知,WPF中的许多控件都是内容控件,而内容控件可包含任何类型以及大量的嵌套内容.例如,可构建包含图形的按钮,创建混合了文本和图片内容的标签,或者为了实现滚动或折叠的显示效果而在特定容器中放置 ...

随机推荐

  1. 内置3D对象-Unity3D游戏开发培训

    内置3D对象-Unity3D游戏开发培训 作者:Jesai 2018-02-12 19:21:58 五大面板: -Hierachy:当前场景中的物体 图 1-1 -Project:项目中的所有资源 图 ...

  2. 【模板整理】Tarjan

    有向图强连通分量 int tot,low[N],dfn[N],scc[N],sccno; int st[N],top,vis[N]; void tarjan(int u){ int v; low[u] ...

  3. 使用整体模型模板辅助器 Using Whole-Model Templated Helpers 模板辅助器方法 精通ASP.NET MVC 5

    怎么会

  4. selenium常见的元素定位方法

    一.获取元素 1)通过谷歌浏览器自动的工具访问百度首页,我们可以看到,页面上的元素都是由一行行的代码组成的,它们之间有层级地组织起来,每个元素之间都有不同的标签和值,我们可以通过这些不同的标签和值来找 ...

  5. 使用FileZilla Pro S3协议访问七牛云对象存储

    偶然发现FileZilla还有Pro版本,主要是比免费版多了一些协议支持,也偶然发现七牛云支持了S3协议接口,这样刚好弥补了其没有FTP的不足,于是找官方文档,折腾一下,使用FileZilla Pro ...

  6. [校内训练20_01_19]ABC

    1.SB题 2.有n个点,m条边,每次加入一条边,你要挑出一些边,使得形成的图每个点度数都为奇数,且最长的边最短. 3.给一个N次多项式,问有多少个质数在任意整数处的点值都是p的倍数,输出它们.$N ...

  7. Quantitative Trading with R(一):两个简单的策略

    下面是两个使用R中的Quantstrat包进行策略构建的例子,都是对600550.ss.600192.ss.600152.ss.600644.ss.600885.ss.600151.ss六只股票进行投 ...

  8. Oracle 11g 单实例静默安装实战记录(linux)

    oracle 11g 单实例静默安装 AUTHOR:Oracle_Ran 环境规划: OS Version : Red Hat Enterprise Linux Server release 6.7 ...

  9. C#系列之占位符的使用方法(二)

    今天,我将简单记录下占位符的使用方法 首先,我们来看不使用占位符的方法来代码输出 int number = 10; int number_1 = 20; int number_2 = 30; Cons ...

  10. 21种JavaScript设计模式最新记录(含图和示例)

    最近观看了<Javascript设计模式系统讲解与应用>教程,对设计模式有了新的认识,特在此做些记录. 一.UML 文中会涉及众多的UML类图,在开篇需要做点基础概念的认识.以下面的图为例 ...