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(包含链接)。如您有任何疑问或者授权方面的协商,请给我留言。
目录
相关文章
|
3月前
|
C#
WPF中动画教程(DoubleAnimation的基本使用)
WPF中动画教程(DoubleAnimation的基本使用)
69 0
|
2月前
|
算法 C# Windows
不可不知的WPF动画(Animation)
【9月更文挑战第19天】在 WPF(Windows Presentation Foundation)中,动画能为应用程序增添生动性和交互性。主要类型包括线性动画和关键帧动画,可针对依赖属性和自定义属性操作。触发方式有事件触发和自动触发,支持暂停、恢复及停止控制。合理使用这些功能并注意性能优化,可创建引人入胜的用户界面。
|
3月前
|
C# UED 开发者
WPF与性能优化:掌握这些核心技巧,让你的应用从卡顿到丝滑,彻底告别延迟,实现响应速度质的飞跃——从布局到动画全面剖析与实例演示
【8月更文挑战第31天】本文通过对比优化前后的方法,详细探讨了提升WPF应用响应速度的策略。文章首先分析了常见的性能瓶颈,如复杂的XAML布局、耗时的事件处理、不当的数据绑定及繁重的动画效果。接着,通过具体示例展示了如何简化XAML结构、使用后台线程处理事件、调整数据绑定设置以及利用DirectX优化动画,从而有效提升应用性能。通过这些优化措施,WPF应用将更加流畅,用户体验也将得到显著改善。
220 1
|
3月前
|
C# UED 开发者
WPF动画大揭秘:掌握动画技巧,让你的界面动起来,告别枯燥与乏味!
【8月更文挑战第31天】在WPF应用开发中,动画能显著提升用户体验,使其更加生动有趣。本文将介绍WPF动画的基础知识和实现方法,包括平移、缩放、旋转等常见类型,并通过示例代码展示如何使用`DoubleAnimation`创建平移动画。此外,还将介绍动画触发器的使用,帮助开发者更好地控制动画效果,提升应用的吸引力。
168 0
|
3月前
|
存储 C# 数据格式
WPF动画教程(PointAnimationUsingPath的使用)
WPF动画教程(PointAnimationUsingPath的使用)
48 0
|
6月前
|
C#
WPF —— 动画缩放变换
`ScaleTransform`用于二维x-y坐标系中对象的缩放,可沿X或Y轴调整。在故事板中,通过RenderTransform.ScaleX和ScaleY属性控制缩放。示例代码展示了如何设置按钮的RenderTransformOrigin、Background等属性,并通过LayoutTransform应用ScaleTransform。当鼠标进入按钮时,EventTrigger启动DoubleAnimation实现X和Y轴的缩放动画。最后,展示了如何将动画集成到自定义按钮样式中。
172 0
|
C#
WPF技术之动画系列-上下运动
本例子展现动画小球上下循环运动
220 0
|
API C# 索引
WPF中的动画——(一)基本概念
原文:WPF中的动画——(一)基本概念 WPF的一个特点就是支持动画,我们可以非常容易的实现漂亮大方的界面。首先,我们来复习一下动画的基本概念。计算机中的动画一般是定格动画,也称之为逐帧动画,它通过每帧不同的图像连续播放,从而欺骗眼和脑产生动画效果。
1075 0
|
C# 测试技术
WPF中的动画——(二)From/To/By 动画
原文:WPF中的动画——(二)From/To/By 动画 我们所实现的的动画中,很大一部分是让一个属性在起始值和结束值之间变化,例如,我在前文中实现的改变宽度的动画:     var widthAnimation = new DoubleAnimation()    {        From = 0,        To = 320,        Duration = TimeSpan.
1009 0
|
算法 C#
WPF中的动画——(五)关键帧动画
原文:WPF中的动画——(五)关键帧动画 与 From/To/By 动画类似,关键帧动画以也可以以动画形式显示目标属性值。 和From/To/By 动画不同的是, From/To/By 动画只能控制在两个状态之间变化,而关键帧动画则可以在多个状态之间变化,例如,对于前面那个改变按钮宽度的例子,如果我们要实现如下效果: 在2秒时将宽度从 0变为350 在7秒时将宽度变为50 在9秒的时候将其宽度变为200 虽然我们可以用三个From/To/By 动画组合实现类似效果,但是这样一来麻烦,二来要感知动画完成事件,不方便在XAML中使用。
1377 0