WPF快速指导15:动画

简介: WPF快速指导15:动画 在WPF或者SilverLight中,所谓动画,就是让一个对象的属性,随着时间而发生变化。动画由时间线(timeline)控制。时间线在C#中的原型为: public abstract class Timeline : Animatable {//省略 } 它是一个抽象类。

WPF快速指导15:动画


在WPF或者SilverLight中,所谓动画,就是让一个对象的属性,随着时间而发生变化。动画由时间线(timeline)控制。时间线在C#中的原型为:

 
 
public abstract class Timeline : Animatable
{
// 省略
}

它是一个抽象类。在WPF中,定义了各类时间线,最常用的有DoubleAnimation,它便继承自Timeline。


1:Storyboard及一个简单示例

容纳时间线的是故事板(Storyboard)。下面是一个最简单的例子:

前台:

 
 
< Canvas x:Name ="Carrier" Width ="800" Height ="600" Background ="Silver" MouseLeftButtonDown ="Carrier_MouseLeftButtonDown" >
< Image x:Name ="image1" Source ="/WpfApplication1;component/run.jpg" >
</ Image >
< Button x:Name ="buttonTest" Click ="buttonTest_Click" Canvas.Top ="250" Content ="测试" >
</ Button >
</ Canvas >

后台:

 
 
private void buttonTest_Click( object sender, RoutedEventArgs e)
{
TranslateTransform animatedTranslateTransform
= new TranslateTransform();
image1.RenderTransform
= animatedTranslateTransform;
DoubleAnimation doubleAnimation
= new DoubleAnimation( 0 , 360 , new Duration(TimeSpan.FromMilliseconds( 1000 )));
this .RegisterName( " AnimatedTranslateTransform " , animatedTranslateTransform);
Storyboard.SetTargetName(doubleAnimation,
" AnimatedTranslateTransform " );
Storyboard.SetTargetProperty(doubleAnimation,
new PropertyPath(TranslateTransform.XProperty));
Storyboard translationStoryboard
= new Storyboard();
translationStoryboard.Children.Add(doubleAnimation);
translationStoryboard.Begin(
this );
}

在这个示例中,Storyboard中,我们使用了DoubleAnimation对象,它表示:随着时间改变一个数值。Storyboard通过SetTargetName方法将DoubleAnimation对象和animatedTranslateTransform联系起来。而animatedTranslateTransform又被指向image1.RenderTransform(关于RenderTransform属性,不明白的可以查看上篇《WPF快速指导14:变换)。这就相当于说,动画被关联到了image1对象上。

这里面要重点讲一下SetTargetProperty方法。该方法第一个参数指定动画对象,第二个方法指的是,在SetTarget方法中被关联的那个的对象的一个属性。在本文的实例中,这个属性是TranslateTransform.XProperty。串联起来,本示例的需求就是:“在1000毫秒的时间里,让image1的TranslateTransform.XProperty属性由0变为360”。如果我们换一个属性,如TranslateTransform.XProperty,则表达的意思是:“在1000毫秒的时间里,让image1离最高处由0变为360”。

本示例运行效果:

img_24aa024dd2a48241e434b5d3c6bb4d84.png


2:关键帧

在上面的这个例子中,我们使用的线性插值。为了调整这个行为,可以用一组关键帧(key frame)来过渡。这也就是说,为了更改动画从起始属性到结束属性的线性行为,可插入一个或者多个关键帧。查看下面的示例:

 
 
TranslateTransform animatedTranslateTransform = new TranslateTransform();
image1.RenderTransform
= animatedTranslateTransform;
this .RegisterName( " AnimatedTranslateTransform " , animatedTranslateTransform);
DoubleAnimationUsingKeyFrames translationAnimation
= new DoubleAnimationUsingKeyFrames();
translationAnimation.Duration
= TimeSpan.FromSeconds( 6 );
translationAnimation.KeyFrames.Add(
new LinearDoubleKeyFrame( 500 , KeyTime.FromTimeSpan(TimeSpan.FromSeconds( 3 ))));
translationAnimation.KeyFrames.Add(
new DiscreteDoubleKeyFrame( 400 , KeyTime.FromTimeSpan(TimeSpan.FromSeconds( 4 ))));
translationAnimation.KeyFrames.Add(
new SplineDoubleKeyFrame( 0 , KeyTime.FromTimeSpan(TimeSpan.FromSeconds( 6 )), new KeySpline( 0.6 , 0.0 , 0.9 ,

0.0 )));
translationAnimation.RepeatBehavior
= RepeatBehavior.Forever;
Storyboard.SetTargetName(translationAnimation,
" AnimatedTranslateTransform " );
Storyboard.SetTargetProperty(translationAnimation,
new PropertyPath(TranslateTransform.XProperty));
Storyboard translationStoryboard
= new Storyboard();
translationStoryboard.Children.Add(translationAnimation);
translationStoryboard.Begin(
this );

在这个示例中,一个共有3个关键帧:LinearDoubleKeyFrame,DiscreteDoubleKeyFrame,SplineDoubleKeyFrame。

LinearDoubleKeyFrame指的是:这是一个线性关键帧。

DiscreteDoubleKeyFrame指的是:这是一个离散关键帧。

SplineDoubleKeyFrame指的是:这是一个加速和减速关键帧。

要体会它们之间的差异,可以运行代码,任何语言描述不抵一次视觉感受。


3:动画缓动

缓动(Easing)允许我们创建各类动画效果,类似反弹或者弹簧效果。如BounceEase,模拟的就是一种弹跳效果。在第一个示例中,我们加入如下语句:           

 
 
doubleAnimation.EasingFunction = new BounceEase() { Bounces = 2 , EasingMode = EasingMode.EaseOut, Bounciness = 2 };

就会发现图片在到达终点会弹跳,然后结束。所有内建的缓动类,都在System.Windows.Media.Animation命名空间中,它们都以Ease结尾。


本代码的源码下载:WpfApplication1.rar

Creative Commons License本文基于 Creative Commons Attribution 2.5 China Mainland License发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名 http://www.cnblogs.com/luminji(包含链接)。如您有任何疑问或者授权方面的协商,请给我留言。
目录
相关文章
|
16天前
|
C#
WPF —— 动画缩放变换
`ScaleTransform`用于二维x-y坐标系中对象的缩放,可沿X或Y轴调整。在故事板中,通过RenderTransform.ScaleX和ScaleY属性控制缩放。示例代码展示了如何设置按钮的RenderTransformOrigin、Background等属性,并通过LayoutTransform应用ScaleTransform。当鼠标进入按钮时,EventTrigger启动DoubleAnimation实现X和Y轴的缩放动画。最后,展示了如何将动画集成到自定义按钮样式中。
12 0
|
7月前
|
C#
WPF技术之动画系列-上下运动
本例子展现动画小球上下循环运动
125 0
|
C#
WPF中的PathAnimation(路径动画)
原文:WPF中的PathAnimation(路径动画)                                   WPF中的PathAnimation(路径动画)                                                               周...
1240 0
|
API C# 索引
WPF中的动画——(一)基本概念
原文:WPF中的动画——(一)基本概念 WPF的一个特点就是支持动画,我们可以非常容易的实现漂亮大方的界面。首先,我们来复习一下动画的基本概念。计算机中的动画一般是定格动画,也称之为逐帧动画,它通过每帧不同的图像连续播放,从而欺骗眼和脑产生动画效果。
1036 0
|
C# 测试技术
WPF中的动画——(二)From/To/By 动画
原文:WPF中的动画——(二)From/To/By 动画 我们所实现的的动画中,很大一部分是让一个属性在起始值和结束值之间变化,例如,我在前文中实现的改变宽度的动画:     var widthAnimation = new DoubleAnimation()    {        From = 0,        To = 320,        Duration = TimeSpan.
970 0
|
算法 C#
WPF中的动画——(五)关键帧动画
原文:WPF中的动画——(五)关键帧动画 与 From/To/By 动画类似,关键帧动画以也可以以动画形式显示目标属性值。 和From/To/By 动画不同的是, From/To/By 动画只能控制在两个状态之间变化,而关键帧动画则可以在多个状态之间变化,例如,对于前面那个改变按钮宽度的例子,如果我们要实现如下效果: 在2秒时将宽度从 0变为350 在7秒时将宽度变为50 在9秒的时候将其宽度变为200 虽然我们可以用三个From/To/By 动画组合实现类似效果,但是这样一来麻烦,二来要感知动画完成事件,不方便在XAML中使用。
1330 0
|
C#
WPF中的动画——(四)缓动函数
原文:WPF中的动画——(四)缓动函数 缓动函数可以通过一系列公式模拟一些物理效果,如实地弹跳或其行为如同在弹簧上一样。它们一般应用在From/To/By动画上,可以使得其动画更加平滑。     var widthAnimation = new DoubleAnimation()    {    ...
933 0
|
C#
WPF中的动画——(三)时间线(TimeLine)
原文:WPF中的动画——(三)时间线(TimeLine) 时间线(TimeLine)表示时间段。 它提供的属性可以让控制该时间段的长度、开始时间、重复次数、该时间段内时间进度的快慢等等。在WPF中内置了如下几种TimeLine: AnimationTimeline :前面已经介绍过,主要用于属性的过渡,这种是最常见的动画。
1421 0
|
C# 容器 调度
WPF中的动画——(六)演示图板
原文:WPF中的动画——(六)演示图板 前面所介绍的都是单一的动画,它只能修改单一属性。有的时候,我们需要将一组动画一起进行,对于一个按钮,我们可能有如下需求: 选择该按钮时,该按钮增大并更改颜色。
735 0
|
前端开发 C#
WPF中的动画——(五)路径动画
原文:WPF中的动画——(五)路径动画 路径动画是一种专门用于将对象按照指定的Path移动的动画,虽然我们也可以通过控制动画的旋转和偏移实现对象的移动,但路径动画更专业,它的实现更加简洁明了。 路径动画中最常用的是MatrixAnimationUsingPath,它通常用于控制对象的MatrixT...
1250 0