WPF 动画 学习笔记

基于时间动画

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

1.创建一个周期性触发的计时器 ,50毫秒触发一次

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

3.不久以后,windows将会要求窗口重新绘制界面,触发自定义的绘图代码

4.自定义的绘图代码之后,渲染旋转之后的文本


即使没有WPF动画支持,也可以简化旋转文本示例,这是因为WPF提供了一个保留的图形模型,该模型确保当窗口发生变化时能够自动重新渲染,这意味着不需要关心无效好重绘自身的情况,而通过下面的步骤就可以实现

1.创建一个周期性触发的计时器(wpf提供了一个在用户界面线程上工作的system.windows.threading.dispatcher.timer计时器)

2.当计时器触发的时候,使用事件处理程序计算一些与动画相关的细节,如新的旋转角度,然后修改相应元素

3.wpf会注意到对窗口中的元素所进行的修改,然后重新绘制并缓存新的窗口内容


尽管这是一个改进,但是基于计时器的动画依然存在一些缺点,它导致代码不是很灵活,对于复杂的效果会变得非常混乱,并且不能得到最佳的性能,而WPF则提供了一个更加高级的模型,通过该模型可以只关注动画的定义,而不担心他们的渲染方式,这个模型基于依赖项属性基础架构





基于属性的动画

动画通常被视为一系列的帧,为了执行动画就要逐帧的显示这些帧,就像定格的视频,WPF动画使用了一个完全不同的模型,本质是那个,WPF动画只不过实在一段时间间隔内修改依赖项属性值的一种方式


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


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

但在许多情况下,基于属性的动画系统不能工作,作为一个经验法则,基于属性的动画系统是为普通windows应用程序添加动态效果的非常好的方式,然而如果需要作为应用程序的核心目标部分使用的动画,并且希望动画在应用程序的整个声明周期中持续运行,可能需要wpf低级的基于帧的渲染支持。



基本动画

wpf动画的第一条规则----每个动画依赖于一个依赖项属性,号还有另一个限制:需要有一个支持该数据类型的动画类,例如button.width属性属性双精度数据类型,为了实现属性的动态化,需要使用doubleAnimation类,但Button.Padding属性使用的是Thickness结构,所以它需要一个ThicknessAnimation类。

这一需要不像wpf动画的第一条规则那么绝对,第一条规则将动画局限于依赖项属性,这是因为对于没有相应动画类的依赖项属性,为了为该属性应用动画,可以针对相应的数据类型创建自己的动画类,但是你会发现system.windows.media.animation名称空间已经为希望使用的大多数数据类型提供了动画类

因为需要数据类型实际上不使用动画,所以没有相应的动画类,一个主要的例子是枚举,例如,可以使用HorizontalAlignment属性控制如何在布局面板中放置一个元素,该属性使用的是HorizontalAlignment枚举值,然而,HorizontalAlignment枚举只允许从4个值中选择一个left right center 和 stretch,这极大的限制了它在动画中的使用,尽管可以在一个方向和其他方向之间进行交换,但是不能将一个元素从一种对齐方式平滑过度当另外一种对齐方式,所以,没有为HorizontalAlignment数据类型提供动画类,可以自己为HorizontalAlignment数据类型构建一个动画,但是仍然要受到4个枚举数值的限制


引用类型通常不能应用动画类,但他们的子属性可以,例如,所有内容控件都支持Background属性,从而可以设置一个Brush对象用于绘制背景,很少使用动画从一个画刷切换到另一个画刷,但是可以使用动画改变画刷的属性,例如SolidColorBrush画刷的Color属性(使用ColorAnimation类)或者改变LinearGradientBrush画刷中的GradientStop对象的Offset属性(使用DoubleAnimation类),这扩展了WPF动画的应用范围,允许用户为元素外观的特定方面应用动画


Animation类

有两种类型的动画-------在一个开始值和结束值之间以逐步增加的方式(被称为线性插值过程)改变属性的动画

                                         以及从一个值突然变成另一个值的动画

然而当改变特定的数据类型时,如String和引用类型的对象,插值是没有意义的,这些数据类型使用一种称为关键帧动画的技术在特定时刻从一个值突然改变到另一个值

所有关键帧动画类都使用“类型名+AnimationUsingKeyFrames”的形式进行命名,如StringAnimationUsingKeyFrames和ObjectAnimationUsingKeyFrames

某些数据类型有关键帧动画类,但是没有插值动画类,例如可以使用关键帧为一个字符串应用动画,但是不能应用插值为字符串应用动画,然而所有数据类型都支持关键帧动画,除非它们根本不支持动画,

((((换句话说 ,所有具有(使用插值)常规动画类(例如DoubleAnimation和ColorAnimation)的数据类型,也有一个相应的用于关键帧动画的动画类型如(DoubleAnimationUsingKeyFrames和ColorAnimationUsingKeyFrames))))))

‘’

实际上还有一种动画类型,这种类型的动画是基于路径动画,并且它比使用插值或关键帧的动画更加专业,基于路径的动画类使用“类型名+AnimationUsingPath”的形式进行命名,如DoubleAnimationUsingPath

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值