这段时间又一直赶任务,结果没有去学习,也没有去写博文,这个动画的内容很早就学了,但是一直没把它整理成博文,现在终于有空就弄一下。

  开始先讲讲在WinPhone中做动画有两种动画类型,一种是基于帧动画另一种是基于时间动画。接着介绍的动画都是Silverlight动画,Silverlight动画有用xaml描述,也有用传统的cs代码文件里描述。随后的内容都是以Silverlight动画为主,关键帧动画,动画的触发机制,透视变换动画,优先级。接下来就详细描述各个内容。

动画分类

  • 基于帧动画:每调用一次函数则算一帧,在调用一次函数则执行一次变化。
  • 基于时间动画:虽然每次都是在函数上进行调用,但是调用时的变化量是按时间作为自变量。

下面这个例子分别使用了两种类型的动画,动画是文字围绕着中心旋转

先是xmal文件

             <TextBlock Grid.Row="0" Grid.Column="0" Text="Time-base" HorizontalAlignment="Center" VerticalAlignment="Center" RenderTransformOrigin="0.5 0.5">
<TextBlock.RenderTransform>
<RotateTransform x:Name="rotate1"/>
</TextBlock.RenderTransform>
</TextBlock> <TextBlock Grid.Row="1" Grid.Column="0" Text="Frame-base" HorizontalAlignment="Center" VerticalAlignment="Center" RenderTransformOrigin="0.5 0.5">
<TextBlock.RenderTransform>
<RotateTransform x:Name="rotate2"/>
</TextBlock.RenderTransform>
</TextBlock>

在cs代码文件中就使用了Rendering事件,该事件需要在构造函数中注册

CompositionTarget.Rendering += CompositionTarget_Rendering;

CompositionTarget_Rendering方法的定义如下

         void CompositionTarget_Rendering(object sender, EventArgs e)
{
rotate1.Angle = (rotate1.Angle + 0.2) % ; TimeSpan elapsedTime = DateTime.Now - dtNow;
rotate2.Angle = (elapsedTime.TotalMinutes * ) % ;
}

Rendering事件是在屏幕刷新时触发的,在这个方法里面执行变换,顺其自然则是基于帧的动画,那么利用DateTime的时间差就可以由帧转化成时间了。

Silver动画

  这里把动画类型分了两种,用的最多的还是基于时间动画,个人估计原因在于基于帧动画实际上是依靠屏幕的刷新率。如果遇到不同的屏幕刷新率,动画播放就会有不同的效果,但是基于时间动画的话就不会受屏幕刷新率的影响,而且基于帧动画消耗资源也会比较多。

  Silverlight动画主要是基于Sotryboard的,使用不同的Animation类,设置对应的targetName受作用的元素与targetProperty受作用的属性。由于动画变换时受变换的作用类型不一样,所以这部分Animation的类有以下几个,DoubleAnimation,ColorAnimation,PointAnimation;这三个子类分别可实现基于数值变化的动画,颜色变换的动画和位置变换的动画。还有几个用于关键帧动画的子类DoubleAnimationUsingKeyFrame,ColorAnimationUsingKeyFrame,PointAnimationUsingKeyFrame,ObjectAnimationUsingKeyFrame,关键帧动画这个先留在后面再说,下面则稍微列举一下简单的Silverlight动画,分别通过在cs实现和通过xmal中中实现

先是通过cs实现的,在xaml里添加以下元素。

             <Button Content="Button" HorizontalAlignment="Center" VerticalAlignment="Center" Click="Button_Click" RenderTransformOrigin="0.5 0.5">
<Button.RenderTransform>
<RotateTransform/>
</Button.RenderTransform>
</Button>

重点在于这个Button的Click,在Button_Click方法里面定义了动画的内容还有控制了动画的开始

         private void Button_Click(object sender, RoutedEventArgs e)
{
Button btn = sender as Button; RotateTransform routate = btn.RenderTransform as RotateTransform; DoubleAnimation anima = new DoubleAnimation();
anima.From = -;
anima.To = ;
anima.By = ;
anima.FillBehavior = FillBehavior.Stop;
anima.Duration = new Duration(TimeSpan.FromSeconds(0.5));
anima.RepeatBehavior = new RepeatBehavior(TimeSpan.FromSeconds());
anima.AutoReverse = true; Storyboard.SetTarget(anima, routate);
Storyboard.SetTargetProperty(anima, new PropertyPath(RotateTransform.AngleProperty)); Storyboard storyboard = new Storyboard();
storyboard.Children.Add(anima);
storyboard.AutoReverse = true;
storyboard.Duration = new Duration(TimeSpan.FromSeconds(0.25));
storyboard.Begin();
}

代码分了三截,第一截是定义了动画的细节,第二截是定义了动画整个变换的过程中受作用的变化属性,在这里而已就是按钮的角度随着动画的执行而改变,最后是StoryBoard的构造和播放StoryBoard里面的所有动画,一个StoryBoard就类似于一个场景,场景里面可以有很多个演员(各个Animation类)按照剧本上的安排(开发人员定义的动画内容)来演戏(执行动画)。上面有涉及到Animation类和StoryBoard类的几个属性,

  • FillBehavior:表示动画执行完毕之后受作用对象的状态,简单理解就是指维持在动画执行完毕之后的那个值还是恢复到动画开始时的那个值;
  • Duration:整个动画过程所花费的时间;
  • RepeatBehavior:动画重复播放的次数,
  • AutoReverse:是否让动画重复播放。

这些属性都是Animation类和StoryBoard类共有的,因为他们都是TimeLine的属性,而这些属性都是TimeLine的属性。这些属性在Animation中设置是只对一个动画受影响,在StoryBoard里设置就对整个StoryBoard里的所有动画都影响。

下面也稍介绍用xmal的方式,也是有这么的一个按钮

            <Button Content="Button2" HorizontalAlignment="Center" VerticalAlignment="Center" Click="Button_Click_1" RenderTransformOrigin="0.5 0.5">
<Button.RenderTransform>
<RotateTransform x:Name="rotate3" />
</Button.RenderTransform>
</Button>

动画就以页面资源的形式

    <phone:PhoneApplicationPage.Resources>
<Storyboard x:Name="storyboard1">
<DoubleAnimation Storyboard.TargetName="rotate3"
Storyboard.TargetProperty="Angle"
From="0" To="360" Duration="0:0:0.5" RepeatBehavior="3"/>
</Storyboard>
</phone:PhoneApplicationPage.Resources>

这里涉及到的属性还有设计与上面用cs的相比起来还是一样的,最有在按钮的Click事件控制动画的播放

        private void Button_Click_1(object sender, RoutedEventArgs e)
{
storyboard1.Begin();
}

关键帧动画

  对于上面提及实现的动画动作可能稍微有点大,而Silverlight动画里面也可以实现关键帧动画,从而控制动画过程中的每个细节。上面介绍的各个UsingKeyFrame的Animation类中,包含了几个KeyFrame结尾的子元素来控制动画的变换中的自变量,这几个子元素分别如下

  • DiscreteXXXKeyFrame:跳跃到特定位置的动画;
  • LinearXXXKeyFrame:线性动画;
  • SplineXXXKeyFrame:加速或减速的变速动画;
  • EasingXXXKeyFrame:渐变函数动画。

上面的这几个元素都是带XXX,就是指对那几种不同的UsingKeyFrame类都有这几个子元素,而Double的就是DiscreteDoubleKeyFrame,Color的就是DiscreteColorKeyFrame。而这四种类型中Discrete和Linear不作展开介绍了。但是KeyFrame的这类元素都有两个比较关键的属性KeyTime和value,value是目标值,完成这一帧所达到的值,keyTime则是完成这个帧时的时间。

  SplineXXXKeyFrame变速动画,这类动画则是利用贝塞尔曲线作为动画的变化速度来控制动画播放,贝塞尔曲线是由两个控制点来控制整条曲线的形状,这两个属性是KeySpline类型的两个成员ControlPoint1和ControlPoint2,而这个KeySpline也是SplineXXXKeyFrame的一个属性成员。

  EasingXXXKeyFrame 渐变函数动画,这个渐变函数如果不是实践过的话也不知道是什么回事,这类的动画是按照各种渐变函数来决定整个动画变换中的变化值,渐变函数的基类是EasingFunctionBase,它的各个子类就是各种具体的渐变函数,对渐变函数动画的动画效果影响因素有两个一个是渐变函数的类型,另一个是插值模式,动画的插值模式通过EaseMode设置,它是一个枚举,有EaseIn,EaseOut,EaseInOut三种,而渐变函数则是由EasingFunction属性设置,渐变函数的类型有11种,这个可以访问MSDN EasingModel枚举那一页来看出各个渐变函数的图象。

动画的触发

  上面列举了的Silverlight动画都是基于StoryBoard的,动画开始是通过Begin()方法的调用,之前调用Begin()方法是在按钮的Click事件里面的,但是可以在元素加载的时候触发这些动画,这里可以用上Silverlight的触发器,各个元素都可以在xmal中使用上这个触发器来执行动画,如同下面格式

                <各种容器.Triggers>
<EventTrigger>
<BeginStoryboard>
<Storyboard >
<!—各种的Animation--!>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</各种容器.Triggers>

透视变换

  上面的动画都是用了元素的RenderTransform,做出来的动画都是二位的仿射变换,但是要做到有三维立体效果的透视变换,那就需要用到元素的另外一个属性Projection,这次受作用的属性是RotationX(RotationY或者RotationZ),PlaneProjection对象有CenterOfRotationX,CenterOfRotationY,CenterOfRotationZ属性来设置旋转轴的中心,xyz代表坐标系中的三条坐标轴,范围是0到1,0是元素的起始位置,1是元素的结束位置,0.5则是中心。GlobalOffsetX,GlobalOffsetY,GlobalOffsetZ是整个对象与对应的坐标轴偏移像素,这只是一个变换的目标对象,仍然可以使用之前说的Silverlight动画,例如下面的把一个文本三维旋转的

            <TextBlock Name="txtblk"
Grid.Row="0" Grid.Column="0"
Grid.ColumnSpan="3"
Text="ROTATE"
FontSize="{StaticResource PhoneFontSizeHuge}"
Foreground="{StaticResource PhoneAccentBrush}"
VerticalAlignment="Center"
HorizontalAlignment="Center">
<TextBlock.Projection>
<PlaneProjection x:Name="planeProjection"
CenterOfRotationX="1" CenterOfRotationY="1"
GlobalOffsetX="-100"/>
</TextBlock.Projection>
</TextBlock>
<phone:PhoneApplicationPage.Resources>
<Storyboard x:Name="rotateX">
<DoubleAnimation Storyboard.TargetName="planeProjection"
Storyboard.TargetProperty="RotationX"
From="0" To="360" Duration="0:0:5"/>
</Storyboard> <Storyboard x:Name="rotateY">
<DoubleAnimation Storyboard.TargetName="planeProjection"
Storyboard.TargetProperty="RotationY"
From="0" To="360" Duration="0:0:5"/>
</Storyboard> <Storyboard x:Name="rotateZ">
<DoubleAnimation Storyboard.TargetName="planeProjection"
Storyboard.TargetProperty="RotationZ"
From="0" To="360" Duration="0:0:5"/>
</Storyboard>
</phone:PhoneApplicationPage.Resources>

属性的优先级

  最后提及一下的优先级的问题,动画本身也是在设置元素的属性,那么对元素属性设置方式多种多样,整个优先级顺序从大到小分别是 属性的强制保护(属性设置后的一些约束)>动画>本地设置(单纯设置属性)>样式设置>主题风格>属性继承

WinPhone学习笔记(三)——WinPhone的动画的更多相关文章

  1. Oracle学习笔记三 SQL命令

    SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)  

  2. [Firefly引擎][学习笔记三][已完结]所需模块封装

    原地址:http://www.9miao.com/question-15-54671.html 学习笔记一传送门学习笔记二传送门 学习笔记三导读:        笔记三主要就是各个模块的封装了,这里贴 ...

  3. JSP学习笔记(三):简单的Tomcat Web服务器

    注意:每次对Tomcat配置文件进行修改后,必须重启Tomcat 在E盘的DATA文件夹中创建TomcatDemo文件夹,并将Tomcat安装路径下的webapps/ROOT中的WEB-INF文件夹复 ...

  4. java之jvm学习笔记三(Class文件检验器)

    java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...

  5. VSTO学习笔记(三) 开发Office 2010 64位COM加载项

    原文:VSTO学习笔记(三) 开发Office 2010 64位COM加载项 一.加载项简介 Office提供了多种用于扩展Office应用程序功能的模式,常见的有: 1.Office 自动化程序(A ...

  6. Java IO学习笔记三

    Java IO学习笔记三 在整个IO包中,实际上就是分为字节流和字符流,但是除了这两个流之外,还存在了一组字节流-字符流的转换类. OutputStreamWriter:是Writer的子类,将输出的 ...

  7. NumPy学习笔记 三 股票价格

    NumPy学习笔记 三 股票价格 <NumPy学习笔记>系列将记录学习NumPy过程中的动手笔记,前期的参考书是<Python数据分析基础教程 NumPy学习指南>第二版.&l ...

  8. Learning ROS for Robotics Programming Second Edition学习笔记(三) 补充 hector_slam

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

  9. Learning ROS for Robotics Programming Second Edition学习笔记(三) indigo rplidar rviz slam

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

  10. Typescript 学习笔记三:函数

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

随机推荐

  1. JavaScript思维导图—运算符

    JavaScript思维导图-来自@王子墨http://julying.com/blog/the-features-of-javascript-language-summary-maps/

  2. 使用MYSQL命令直接导入导出SQL文件

    很多时候,我们的数据开发都会用到很多开发利器,比如powerdesigner, navicat等这些软件,虽然好用,但是要收费,在公司里面是禁止使用盗版软件的,怕罚款各方面的,所以我们也不敢直接在公司 ...

  3. Linux-磁盘管理小结

    这篇博文主要总结了Linux磁盘的一些操作,主要是硬盘的加载,分区(MBR分区和GPT分区),分区的挂载,以及swap分区的加载设置. 基础命令 df查看磁盘分区使用状况 -l //仅显示本地磁盘(默 ...

  4. jquerymobile仿微信 - 01

    jquerymobile仿微信 - 01 jquerymobile的组件感觉不咋地哇 本地调试最好是开一个web server,不然数据访问会有问题 <div data-role="p ...

  5. 快速入门系列--CLR--03泛型集合

    .NET中的泛型集合 在这里主要介绍常见的泛型集合,很多时候其并发时的线程安全性常常令我们担忧.因而简述下.NET并发时线程安全特性,其详情请见MSDN. 普通集合都不支持多重并发写操作 部分支持单线 ...

  6. JSP网站开发基础总结《十三》

    继上一篇为大家补充过滤器类后,本篇为大家简单介绍一下如何实现验证码效果.验证码的作用是什么呢?1.防止恶意注册2.防止恶意提交3.防止盗取账户等等,总的来说验证码的存在就是为了,防止非人为的操作,不过 ...

  7. Cwinux源码解析(五)

      Cwinux源码解析(五)

  8. 可变参数宏__VA_ARGS__

    在 GNU C 中,宏可以接受可变数目的参数,就象函数一样,例如:#define pr_debug(fmt,arg...) \printk(KERN_DEBUG fmt,##arg) 用可变参数宏(v ...

  9. Deep learning:五十(Deconvolution Network简单理解)

    深度网络结构是由多个单层网络叠加而成的,而常见的单层网络按照编码解码情况可以分为下面3类: 既有encoder部分也有decoder部分:比如常见的RBM系列(由RBM可构成的DBM, DBN等),a ...

  10. c#字符串操作方法实例

    # 字符串是使用 string 关键字声明的一个字符数组.字符串是使用引号声明的,如下例所示: string s = "Hello, World!"; 字符串对象是“不可变的”,即 ...