C#WPF XAML 动画
一、动画(Animatuon) I.WPF三种动画: 1.(1)线性插值:在开始值和结束值之间以逐步增加的方式改变属性的动画(线性插值过程)。 (2)、关键帧:从一个值突然变成另一值的动画(关键帧动画)。所有关键帧动画都使用"类型名 + AnimationUsingKeyFrames " 的形式进行命名,比如StringAnimationUsingKeyFrames和ObjectAnimationUsingKeyFrames。 (3)、路径:在System.Windows.Media.Animation名称空间中将发现以下内容: 7个 “类型名+Animation类” 这些类使用插值动画。 22个 “类型名+AnimationUsingKeyFrames” 这些类使用关键帧动画。 3个 "类型名+AnimationUsingPath"类这类使用基于路径的动画。 (4)、在项目引用“System.Xml”中双击,通过搜索System.Windows.Media.Animation名称空间找到“ColorAnimation”(关键帧动画)和“ColorAnimationUsingKeyFrames(颜色插值动画)” (5)、某些数据类型有关键帧动画类,但没有插值动画类。例如,可使用关键帧为字符串应用动画,不能使用插值为字符串应用动画。然而,所有数据类型都支持关键帧动画,除非 他们根本不支持动画。 (6)、所有具有(使用插值)常规动画类的数据类型,也都有相应的关键帧动画的动画类型,如线性插值的DoubleAnimation对应DoubleAnimationUsingKeyFrames。另外还有一种基于 路径的动画。 (7)、有关键帧动画的未必有线性插值,有线性插值动画的一定有关键帧动画。 2.动画创建 (1)、创建 DoubleAnimation 使元素淡入和淡出的一种方法是对其属性进行动画处理 Opacity 。 由于 Opacity 属性的类型为 Double ,因此需要一个生成双精度值的动画。 DoubleAnimation是一种动画。 (2)、定义动画:TargetName指定操作控件,TargetProperty指定操作控件的具体属性, From指定开始值,To指定结束值,Duration指定所需时间。 3.故事板 (1)、若要将动画应用于对象,需要创建 Storyboard (故事板):是动画的基本单元,控制动画的播放、暂停、停止等操作,并使用 TargetName 和 TargetProperty 附加属性指定要进行动画处理的对象和属性,动画类型声明过后,需要使用EventTrigger(事件触发器)触发。 4.事件触发器(将演示图板与触发器关联) (1)、通过事件触发器播放BeginStoryboard故事板的动画效果。 (2)、Duration :起始值到目标值需要时间5秒,AutoReverse=“True”:使元素消失后变为视野RepeatBehavior=“Forever”: 使动画无限重复。 II.线性插值动画 1.两个属性: (1)、DoubleAnimatuin:属于Double类型的属性都可以使用它产生学习插值动画效果。 (2)、ColorAnimatuin:作用于属性为Color类型对象的线性操作动画,用于改变对象的填充颜色。 2.四个线性插值动画对象属性: (1)、From:动画从From属性指定的值继续到正在进行动画处理的属性基值或前一动画的输出值,具体取决于前一动画的配置方式。 (2)、To:动画从进行动画处理的属性基值或前一动画的输出值继续到To属性指定的值。 (3)、By:动画从正在进行动画处理的属性基值或前一动画的输出值继续到该值与By属性指定的值之和。 (4)、Duration:动画执行一次持续的时间长度,Duration的格式为时:分:秒。 3.五个动画播放控制属性: (1)、BeginTime:动画开始时间,默认的单位是天,也可以指定为时:分:秒。 (2)、RepeatBehavior:用来声明动画重复次数,支持3种类型值:重复次数(格式–次数+X);一个时间段(格式-时:分:秒);特殊值Forever(代表无限循环)。 (3)、AutoReverse:指定动画结束后是否向后继续播放,默认只为false,若设置为true,动画结束时会回到起始位置。 (4)、SpeedRatio:用来增加或减小动画的速度,默认值为1,若增加它,动画产生加速播放的效果。 (5)、FillBehavior:决定什么时候发生动画,什么时候结束,默认值为HoldEnd,表示动画结束后保持当前值不变,也可以设置为Stop,表示动画结束时属性再次回到起始值。 4.动画的生命周期。 从技术的角度看,WPF动画只是暂时的,这意味着它们不能真正改变基本属性的值, 当动画处于活动状态时,只是覆盖了属性的值,单向动画,在动画运行结束后会保持处于活动状态,这是因为动画需要将按钮的宽度保持为新值,这会导致如下常见问题,如果尝试使用代码在动画完成后修改属性值,代码将不会起作用,因为代码只是为属性指定了一个新的本地值,但仍会先试用动画之后的属性值,为了解决动画完成后能修改属性的值,有以下两个属性解决。 (1)、“AutoReverse”默认为false在false值的时候动画会在执行完后重新回到起点继续执行,如果设置为true值时动画在执行完后倒退执行动画(缓慢)。 (2)、“FillBehavior”决定什么时候发生动画,什么时候结束,默认值为HoldEnd,表示动画结束后保持当前值不变,也可以设置为Stop,表示动画结束时属性再次回到起始值(瞬间)。 (3)、“BeginTime”值设置动画在几秒后才执行,“RepeatBehavior”如果设置为具体的整数值的时候就是循环多少遍,如果是一个时间段时:份:秒的时候如0:0:2的时候就是执行两秒就停止,“SpeedRatio”数值为整数时表示为动画执行的速度。 III、关键帧动画 1.关键帧动画:关键帧动画根据目标属性值之间的差异产生各种动画效果,一个关键帧动画可以在任意多个的目标属性值之间进行渐变,关键帧动画可以产生更复杂的动画效果。 (1)、关键帧2个元素:DoubleAnimationUsingKeyFrames(Double关键帧动画)、ColorAnimationUsingKeyFrames(Color关键帧动画)。 (2)、DoubleAnimationUsingKeyFrames(Double关键帧动画),动画效果为矩形向右一帧一帧的移动,没有过渡的过程。 (3)、ColorAnimationUsingKeyFrames(Color关键帧动画),动画效果为颜色以一帧一帧的方式进行变换,没有过渡的过程。 (4)、From属性是元素的开始值,To属性是元素属性的结束值,Duration是整个动画执 行的时间。即使不使用To属性,也可以使用By属性,By值被简单地增加到From值上,使 其达到To值。不过,对于非数值数据类型来说,By属性是没有意义的。 (5)、 doubleAnimation.To = 250;是总数, doubleAnimation.By = 70;是前面按钮的值加(150 + 70 = 220)。 线性动画 :ColorAnimation、 DoubleAnimation、 PointAnimation ,它们均继承自 Timeline 。 关键帧动画 : ColorAnimationUsingKeyFrames、 DoubleAnimationUsingKeyFrames、 PointAnimationUsingKeyFrames、 ObjectAnimationUsingKeyFrames 。 2.动画的Completed事件 (1)、使用Completed事件时,要将事件设置BeginAnimation()方法之前,否则不起作用。在Completed中,可通过调用BeginAnimation()方法来渲染不活动的动画,为此,只需要 指定属性,并为动画对象传递null引用。 IV、TimeLine类 1.TimeLine类的常用属性 (1)、BeginTime 设置将被添加到动画开始之前的延时时间(TimeSpan类型),这一延时总被加载到总时间,具有5秒延时的5秒动画,总时间是10秒。 (2)、Duration 动画开始到结束的运行时间。 (3)、SpeedRatio 提高或减慢动画速度。SpeedRatio属性值是1,如果增加该属性值为5,动画的速度就会变成原来的5倍。 (4)、AcclerationRatio 、DecelerationRatio 使动画不是线性的,从而开始时较慢,或者开始时较快,这两个属性的值都在0~1之间,这两个属性值之和不能超过1。 (5)、AutoReverse 如果为true,当动画完成时会自动反向播放,返回到原始值。 (6)、FillBehavior 决定当动画结束时,如何操作。 (7)、RepeatBehavior 通过该属性,可以使用指定的次数或时间间隔重复动画,用于设置这个属性的RepeatBehavior对象决定了确切的行为。 2.AccelerationRatio和DeceleRation属性 (1)、可以通过AcclerationRation和DecelerationRation属性压缩部分时间轴,使动画运行的更快,并将拉伸其他时间进行补偿,使总时间保持不变。这两个属性都表示百分比值,例如,将AcceleRation属性设置为0.3,表示希望使用动画持续时间中前30%的时间进行加 速。例如在1个10秒的动画中,前3秒会加速运行,而剩余的7秒会以恒定不变的速度运 行,如果将DeceleRation属性设置为0.3,那么最后3秒回减速运行。 V、故事板、事件触发器 1.故事板: 故事板是增强的时间线,可用来分组多个动画,而且具有控制动画播放的能力—暂停、 停止以及播放位置。然而Storyboard类提供的最基本功能是,能够使用TargetProperty 和TargetName属性指向某个特定属性和特定元素,换句话说,故事板在动画和希望应 用动画的属性之间架起了一座桥梁。其中TargetProperty属性和TargetName属性都是 附加属性,故事板是BeginAnimation()方法的XAML等价物,通过故事板将动画指定到 合适的元素和属性。 (1)、上面一个故事板只能操作一个样式,而下面DoubleAnimation类可以操作多个样式。 (2)、同步的动画:StoryBoard类间接地继承自TimeLineGroup类,所以StoryBoard类能包含多个动画,这些动画可以作为一组进行管理,这意味着它们可以在同一时间开始。 2.事件触发器 可以在以下4个位置定义事件触发器。 (1)、在样式中(Style.Triggers集合)。 (2)、在数据模板中(DataTemplate.Triggers集合)。 (3)、在控件模板中(ControlTemplate.Triggers集合)。 (4)、直接在元素中定义事件触发器(FrameworkElement.Triggers集合)。 (5)、当创建事件触发器时,需要指定开始触发器的路由事件和触发器执行的一个或多个动作,对于动画,最常用的动作是BeginStoryboard,该动作相当于调用BeginAnimation() 方法,所有事件触发器都可以启动动作,所有动作都由继承System.Windows.TriggerAction的类表示。 3.使用样式关联触发器 (1)、有三种基本类型的WPF触发器:属性触发器、数据触发器以及事件触发器。使用触发器是关联动画的最常用方式之一。 VI.控制播放 1.一旦创建故事版,就可以使用其他动作控制故事板,这些动作类都继承自 ControllableStoryboardAction类,控制故事版的主要类如下: (1)、PauseStoryboard 停止播放动画并且保持当前位置 。 (2)、ResumeStoryboard 恢复播放暂停的动画。 (3)、StopStoryboard 停止播放动画,并将动画时钟重新设置到开始位置。 (4)、SeekStoryboard 跳到动画时间线中的特定位置,如果当前动画正在播放,就继续从新位置播放。如果当前动画是暂停的,就继续保持暂停。 (5)、SetStoryboardSpeedRatio 改变整个故事板的SpeedRatio属性值。 (6)、SkipStoryboardToFill 将故事板移动到时间线的终点。FillBehavior属性设置为(7)、HoldEnd,动画继续保持最后的值。 (8)、RemoveStoryboard 移除故事板,停止所有正在运行的动画,并将属性返回为原来的、最后一次设置的数值。 (9)、点击开始按钮图片透明度逐渐减少,点击暂停按钮动画暂停或继续执行动画,点击恢复按钮暂停的动画继续执行,点击停止按钮动画停止恢复到原来开始状态,点击移除按钮动画移除恢复原来状态。 (10)、必须在同一个Triggers集合中定义所有的触发器,如果将BeginStoryboard动作的触发器和PauseStoryboard动作的触发器放置到不同的集合中,PauseStoryboard动作就无法工作。 2.故事板事件 (1)、Completed 动画已经到达终点 。 (2)、CurrentGlobalSpeedInvalidated 速度发生了变化,或者动画被暂停、重新开始、停止或移到某个新的位置。 (3)、CurrentStateInvalidated 动画已经开始或结束,在动画执行的开始和动画执行结束后触发。 (4)、RemoveRequested 动画正在被移除时触发事件。 2.(1)、监视动画进度: 如果要监视动画,要用到Storyboard的一些事件。在这里使用的是CurrentTimeInvalidated事件,每次向前移动动画时钟都会引发该事件。当引发 CurrentTimeInvalidated事件时,发送者是Clock对象(Color类位于System.Windows.Media.Animation名称空间中),可通过Clock对象检索当前时间,当前时间使用TimeSpan对象表示,并且可检索当前进度,当前进度使用0~1之间的数值表示。 (2)、CurrentTimeInvalidated 动画时钟已经向前移动了一个步长,正在更改动画。当动画开始、停止或结束时也会引发该事件,即在动画执行开始和变化中与结束执行。 (3)、进行动画监测,利用进度条直观的显示动画的进度,通过Clock对象检索当前时间,当前时间使用TimeSpan对象表示,可检索当前进度。
|