【WPF学习】第四十八章 理解WPF动画
在许多用户框架中(特别是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动画的更多相关文章
- 【WPF学习】第二十八章 程序集资源
WPF应用程序中的程序集资源与其他.NET应用程序中的程序集资源在本质上是相同的.基本概念是为项目添加文件,从而Visual studio可将其嵌入到编译过的应用程序的EXE或DLL文件中.WPF程序 ...
- 【WPF学习】第十八章 多点触控输入
多点触控(multi-touch)是通过触摸屏幕与应用程序进行交互的一种方式.多点触控输入和更传统的基于笔(pen-based)的输入的区别是多点触控识别手势(gesture)——用户可移动多根手指以 ...
- 【WPF学习】第十五章 WPF事件
前两章学习了WPF事件的工作原理,现在分析一下在代码中可以处理的各类事件.尽管每个元素都提供了许多事件,但最重要的事件通常包括以下5类: 生命周期事件:在元素被初始化.加载或卸载时发生这些事件. 鼠标 ...
- “全栈2019”Java第四十八章:重写方法Override
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- Gradle 1.12用户指南翻译——第四十八章. Wrapper 插件
本文由CSDN博客貌似掉线翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...
- 【WPF学习】第二十六章 Application类——应用程序的生命周期
在WPF中,应用程序会经历简单的生命周期.在应用程序启动后,将立即创建应用程序对象,在应用程序运行时触发各种应用程序事件,你可以选择监视其中的某些事件.最后,当释放应用程序对象时,应用程序将结束. 一 ...
- 【WPF学习】第五十八章 理解逻辑树和可视化树
在前面章节中,花费大量时间分析了窗口的内容模型——换句话说,研究了如何在其他元素中嵌套元素,进而构建完整的窗口. 例如,考虑下图中显示的一个非常简单的窗口,该窗口包含两个按钮.为创建该按钮,在窗口中嵌 ...
- 【WPF学习】第四十九章 基本动画
在前一章已经学习过WPF动画的第一条规则——每个动画依赖于一个依赖项属性.然而,还有另一个限制.为了实现属性的动态化(换句话说,使用基于时间的方式改变属性的值),需要有支持相应数据类型的动画类.例如, ...
- 【WPF学习】第十四章 事件路由
由上一章可知,WPF中的许多控件都是内容控件,而内容控件可包含任何类型以及大量的嵌套内容.例如,可构建包含图形的按钮,创建混合了文本和图片内容的标签,或者为了实现滚动或折叠的显示效果而在特定容器中放置 ...
随机推荐
- 关于爬虫的日常复习(2)—— urllib库
- 获取各类前几名数据的MYSQL写法
前几天,某在培训的朋友问我一个问题:查询每门功课成绩最好的前两名该怎么写. 这个问题虽然听起来挺简单,但是很有意思,于是我就新建了一张如下的表: stuNo为学号,stuScore为分数,course ...
- 整理OD一些快捷键和零碎知识点
第一次记录:2019.9.15 完成了近期基本知识点的记录 第二次记录:2019.9.16 更新VB和的Delphi的汇编代码特点 介绍几个快捷键: Alt+B 断点编辑器,空格键可切换断点状态 ct ...
- python 抓一下 循环的访问也可以
#!/usr/bin/python # -*- coding: utf-8 -*- #encoding=utf-8 #Filename:urllib2-header.py import urllib2 ...
- python输出结果后面带着一个“None”
执行代码的时候,输出的结果中含有一个“None” 只要将最后一行代码的print() 去掉即可 改成 my_range.get_range() 或者是将 函数中的print(range) 改成 r ...
- 工具之sort
转自:http://www.cnblogs.com/dong008259/archive/2011/12/08/2281214.html sort命令是帮我们依据不同的数据类型进行排序,其语法及常用参 ...
- ios---剪裁圆形图片方法
剪裁圆形图片 - (instancetype)xmg_circleImage { // 1.开启图形上下文 // 比例因素:当前点与像素比例 UIGraphicsBeginImageContextWi ...
- springboot mybatis 多数据源配置支持切换以及一些坑
一 添加每个数据源的config配置,单个直接默认,多个需要显示写出来 @Configuration @MapperScan(basePackages ="com.zhuzher.*.map ...
- CSS学习笔记--Div+Css布局(div+span以及盒模型)
1.DIV与SPAN 1.1简介 1.DIV和SPAN在整个HTML标记中,没有任何意义,他们的存在就是为了应用CSS样式 2.DIV和span的区别在与,span是内联元素,div是块级元素 内联元 ...
- 惠普电脑win10关闭自动调节亮度
自动调节亮度真的太烦人了,突然从亮的画面变暗,又从暗的亮度变量,眼睛受不了.但是试了很多种方法都不行. 方法 第一种: 有一些电脑是有在设置--->显示界面--->有一个 关闭自动调节 按 ...