当前位置: 首页 > 编程日记 > 正文

Windows Phone开发(39):漫谈关键帧动画上篇 转:http://blog.csdn.net/tcjiaan/article/details/7550506...

尽管前面介绍的几种动画会让觉得很好玩了,但是,不知道你是否发现,在前面说到的一系列XXXAnimation中,都有一个共同点,那就是仅仅针对两个值的目标值之间产生动画,如果使用By,将在原值和加上By后的目标值之间进行动画处理;如果使用From,To,那就更好理解了,就是首尾两个值之间值的动画。

那么,如果我希望三个值呢?或者N多个值呢?每个值之间的时间间隔不一样呢?如果我还希望更复杂的动画效果呢?比如可以附加缓动函数的。显然,前面我们提到的几个动画类是不能完成的。

不知道你以前有没有耍过Flash,若是在Flash里面,你会怎么做?对啊,我肯定会说——关键帧啊。是啊,那么,Silverlight for Windows phone里面有没有关键帧动画呢?答案显然是Yes的。

相对于前面说的简单动画而言,关键帧动画会显得更为复杂,更难理解,我问你,你怕了吗?

如果你怕了,那就不要往下看了,你只能中途而废了,回家被母亲骂了。如果你敢于挑战,那就不要犹豫,迎难而上!

先向大家透露一个好消息,其实在实际开发中,你不一定要手写XAML的,还记得那个人类历史上从未有过的强大设计工具——Express Blend吧,嗯,对D,必要的时候,你可以拿出来用一下,不要用这么好的东东在硬盘里生锈,会污染环境的哦。用那家伙,做动画就方便了,你会怀疑你在用Flash,说不定比Flash还爽。

如果你问我当初是怎么学习关键帧动画的,我只能通俗地回答你:唯Coding尔。至于你信不信,反正你想成为高手,你必须相信这句话。

扯蛋的话就不聊了,首先我们要先摸清一下与关键帧有关的一些类的大概线路。

从前面的课程中,大家一定知道,一个Storyboard里面可以放N个Timeline对象,但你知道,Timeline是抽象类,说白了,就是可以在其中放置从Timeline派生的类的对象,Storyboard除外,这个可不能嵌套。

也就是说,Storyboard里央也可以放N个关键帧时间线,和简单动画一个样,关键帧动画无非也是针对Double,Color,Point等目标值的。很好找,只要你看到有XXXAnimationUsingKeyFrames字样的,都是关键帧动画的时间线,为什么后面有个s,呵,复数形式,小学英语了,不用我解释了,既然是复数,当然一个时间线中可以有N个关键帧了。

现在,你一定是云里雾里的,所以说嘛,理论的东西讲得再多也是废话,还是实例可爱一点吧?

这一节先来讲一下DoubleAnimationUsingKeyFrames,里面的关键帧有三种:LinearDoubleKeyFrame、SplineDoubleKeyFrame和EasingDoubleKeyFrame,我们只玩前面两个,后面那个是带缓动函数的动画,由于缓动动画的原理都一样,可以举一反六,所以我打算放到专门的一节中去吹。

LinearDoubleKeyFrame是比较好懂的,其实它和DoubleAnimation很像,只是关键帧的特点就是一个时间点对应一个值,因此,记住这句话:任何关键帧都有KeyTime和Value一一对应的,一个时间点对应一个值。

而线性关键帧动画的特点就是“匀速直线运动”,复习一下初中物理知识。两个关键之间的两个值都是根据时间间隔的大小均匀计算的。

另外,再看一下SplineDoubleKeyFrame,这个东西比较难理解,其实,你不理解它也可以用的,真的,这世界上有些东西不一定非要你弄懂了才能用的,比如,你不太可能在吃药之前要研究一下药是怎么加工出来的再吃,你吃饭之前难道也要想明白大米是如何种出来才吃吗?显然不是的。

SplineDoubleKeyFrame被SDK文档翻译为样条内插,这更增加了神奇感。我在学习的时候,凡是遇到这种根本读不懂的东西的话,我第一时间就写代码来试,写不同的代码,从不同的角度去测试,玩多了,你的灵感就来了。

这个什么内插补间动画,说通俗一点,不就是“变速直线运动”了,你看,又复习中考物理了,唉,当年我差点考满分,就是被加速度这玩儿耍了。

其中关键的是有个KeySpline属性,它设置一个KeySpline对象,KeySpline类有两个属性:ControlPoint1和ControlPoint2,就是两个点,传说是贝塞尔曲线的两个控制点。

真的复杂了,如果你觉得真的难理解的话,有没有兴趣玩一下这个游戏?玩了之后,你一定对这个东东有更深的体会,游戏地址:http://samples.msdn.microsoft.com/Silverlight/SampleBrowser/index.htm#/?sref=KeySplineExample

这个游戏很好玩的,一定要认真玩啊。

下面,我们动手干活,先来一段美丽的XAML代码。+

[html] view plaincopyprint?
  1. <Grid Loaded="OnGridLoaded">
  2. <Ellipse VerticalAlignment="Top" HorizontalAlignment="Left"
  3. Width="100" Height="100" Fill="Blue">
  4. <Ellipse.RenderTransform>
  5. <TranslateTransform x:Name="trf"/>
  6. </Ellipse.RenderTransform>
  7. </Ellipse>
  8. <Grid.Resources>
  9. <Storyboard x:Name="storybrd">
  10. <DoubleAnimationUsingKeyFrames Duration="0:0:6"
  11. RepeatBehavior="Forever"
  12. Storyboard.TargetName="trf"
  13. Storyboard.TargetProperty="X">
  14. <LinearDoubleKeyFrame KeyTime="0:0:6" Value="420"/>
  15. </DoubleAnimationUsingKeyFrames>
  16. <DoubleAnimationUsingKeyFrames Duration="0:0:6"
  17. RepeatBehavior="Forever"
  18. Storyboard.TargetName="trf"
  19. Storyboard.TargetProperty="Y">
  20. <SplineDoubleKeyFrame KeyTime="0:0:2" Value="700">
  21. <SplineDoubleKeyFrame.KeySpline>
  22. <KeySpline ControlPoint1="0,0" ControlPoint2="0,1"/>
  23. </SplineDoubleKeyFrame.KeySpline>
  24. </SplineDoubleKeyFrame>
  25. <SplineDoubleKeyFrame KeyTime="0:0:3" Value="550">
  26. <SplineDoubleKeyFrame.KeySpline>
  27. <KeySpline ControlPoint1="1,0" ControlPoint2="0.5,0"/>
  28. </SplineDoubleKeyFrame.KeySpline>
  29. </SplineDoubleKeyFrame>
  30. <SplineDoubleKeyFrame KeyTime="0:0:5" Value="95">
  31. <SplineDoubleKeyFrame.KeySpline>
  32. <KeySpline ControlPoint1="0,0" ControlPoint2="0,0.5"/>
  33. </SplineDoubleKeyFrame.KeySpline>
  34. </SplineDoubleKeyFrame>
  35. <LinearDoubleKeyFrame KeyTime="0:0:6" Value="730"/>
  36. </DoubleAnimationUsingKeyFrames>
  37. </Storyboard>
  38. </Grid.Resources>
  39. </Grid>


代码就这样的,看不懂后果自负,第一节中就说过了,先把WPF和Silverlight耍了,再来耍WP。

后台代码还要加一个,处理上面的OnGridLoaded事件。

[csharp] view plaincopyprint?
  1. private void OnGridLoaded(object sender, RoutedEventArgs e)
  2. {
  3. this.storybrd.Begin();
  4. }


由于是动画,截图没有意义,就不发了,自己运行一下吧。你的作品,你一定很高兴!

历史证明,一个例子是不够的,下面再来一“瓶”,这个例子我们对一个Image控件玩动画,让图片动着出来,动着滚蛋,主要用到透视变换。

[html] view plaincopyprint?
  1. <Grid Loaded="OnGridLoaded">
  2. <Image Name="img" Source="/PhoneApp1;component/1.jpg" Stretch="Uniform" Opacity="0">
  3. <Image.Projection>
  4. <PlaneProjection x:Name="prj" />
  5. </Image.Projection>
  6. </Image>
  7. <Grid.Resources>
  8. <Storyboard x:Name="std" RepeatBehavior="Forever" Duration="0:0:12">
  9. <DoubleAnimationUsingKeyFrames Storyboard.TargetName="img"
  10. Storyboard.TargetProperty="Opacity">
  11. <LinearDoubleKeyFrame KeyTime="0:0:3" Value="1"/>
  12. <LinearDoubleKeyFrame KeyTime="0:0:8" Value="1"/>
  13. <LinearDoubleKeyFrame KeyTime="0:0:12" Value="0"/>
  14. </DoubleAnimationUsingKeyFrames>
  15. <DoubleAnimationUsingKeyFrames Storyboard.TargetName="prj"
  16. Storyboard.TargetProperty="LocalOffsetZ">
  17. <LinearDoubleKeyFrame KeyTime="0:0:0" Value="-6000"/>
  18. <LinearDoubleKeyFrame KeyTime="0:0:8" Value="0" />
  19. <LinearDoubleKeyFrame KeyTime="0:0:12" Value='-12'/>
  20. </DoubleAnimationUsingKeyFrames>
  21. <DoubleAnimationUsingKeyFrames Storyboard.TargetName="prj"
  22. Storyboard.TargetProperty="RotationZ">
  23. <SplineDoubleKeyFrame KeyTime="0:0:0" Value="360"/>
  24. <SplineDoubleKeyFrame KeyTime="0:0:8" Value="0">
  25. <SplineDoubleKeyFrame.KeySpline>
  26. <KeySpline ControlPoint1="0,0" ControlPoint2="0.25,0.5"/>
  27. </SplineDoubleKeyFrame.KeySpline>
  28. </SplineDoubleKeyFrame>
  29. </DoubleAnimationUsingKeyFrames>
  30. <DoubleAnimationUsingKeyFrames Storyboard.TargetName="prj"
  31. Storyboard.TargetProperty="RotationY">
  32. <LinearDoubleKeyFrame KeyTime="0:0:8" Value="0"/>
  33. <LinearDoubleKeyFrame KeyTime="0:0:12" Value="90"/>
  34. </DoubleAnimationUsingKeyFrames>
  35. </Storyboard>
  36. </Grid.Resources>
  37. </Grid>


别忘了处理OnGridLoaded。

[csharp] view plaincopyprint?
  1. private void OnGridLoaded(object sender, RoutedEventArgs e)
  2. {
  3. this.std.Begin();
  4. }


这个嘛,还是发个图好点,免得有人说没真相,图片大家可以随便找,只要内容健康就行了。

还要告诉各位一件事,免得大家去“狗狗摆渡”,与动画相关的类,基本上都位于System.Windows.Media.Animation命名空间。

至于源码问题,大部分文章我会保留源码,我这个人比较落后,没有用网盘,所以,暂时这样吧,有需要源码的朋友,请留下你那个心爱的伊妹儿做人质吧,我会善待她的,放心。

转载于:https://www.cnblogs.com/songtzu/archive/2012/07/24/2607100.html

相关文章:

性能定位常用命令整理

统计每秒钟Nginx收到多少请求&#xff1a; cat access.log | grep 2019:20:19:50 | wc -l 解释&#xff1a;access.log为Nginx的日志&#xff0c;通过Nginx的配置文件nginx.conf查看日志文件名称和位置&#xff0c;2019:20:19:50 表示获取20点19分50秒接收的请求数&#xff0c;…

4块硬盘做raid几_HP-P4500存储RAID硬盘离线数据恢复案例

在这里北亚小编分享一篇关于HP-P4500存储RAID硬盘离线数据恢复案例&#xff0c;经客户描述&#xff1a;一台HP-P4500的存储系统&#xff0c;底层是12块1TB的硬盘组的RAID。其中每6个1TB的盘一组&#xff0c;第一组的前面一部分组了一个RAID01&#xff0c;是存放HP-P4500嵌入式系…

十个利用矩阵乘法解决的经典题目

出自matrix67.com 好像目前还没有这方面题目的总结。这几天连续看到四个问这类题目的人&#xff0c;今天在这里简单写一下。这里我们不介绍其它有关矩阵的知识&#xff0c;只介绍矩阵乘法和相关性质。 不要以为数学中的矩阵也是黑色屏幕上不断变化的绿色字符。在数学中&…

maven生命周期理解

你可以仅仅调用clean来清理工作目录&#xff0c;仅仅调用site来生成站点。当然你也可以直接运行 mvn clean install site 运行所有这三套生命周期。 知道了每套生命周期的大概用途和相互关系以后&#xff0c;来逐个详细看一下每套生命周期&#xff0c;Clean和Site相对比较简单&…

安装envi出现cannot find lincese_Ubuntu 16.04 安装 CUDA10.1 (解决循环登陆的问题)

0. 前言直接用 cuda安装文件同时安装 NVIDIA 驱动和 CUDA&#xff0c;没有单独安装更高版本的 NVIDIA 驱动&#xff1b;为避免浪费显存&#xff0c;图形化界面显示是在Intel 集显环境下&#xff0c;NVIDIA 独显做计算&#xff1b;循环登陆问题是因为安装时没有加 --no-opengl-l…

POJ1067_取石子游戏_威佐夫博弈

/* *State: 1067 Accepted 176K 16MS C 435B *题目大意&#xff1a; * 威佐夫博弈 *解题思路&#xff1a; * 略。 */ #include <iostream> #include <stdio.h> #include <cmath> using namespace std;int main(void) {int big,…

cuda cudnn pytorch版本对应关系

1. cuda和cudnn版本对应关系 https://developer.nvidia.com/rdp/cudnn-archive#a-collapse742-10 转载于:https://www.cnblogs.com/yeran/p/11345990.html

【转载】WinCE OAL架构分析

转载自&#xff1a;http://blog.csdn.net/nanjianhui/article/details/3830452 我个人认为OAL应该是WinCE BSP中最为重要的一个模块了&#xff0c;简单回顾一下&#xff0c;WinCE BSP由Bootloader&#xff0c;Drivers&#xff0c;OAL和配置文件组成。Bootloader一般指EBOOT&…

centos7 中搭建gitlab

1、在virtual box中新建一个虚拟机 2、gitlab ce&#xff08;community版本&#xff09;地址&#xff1a;https://about.gitlab.com/installation/#centos-7?versionce 如果在执行如下安装命令提示无法连接&#xff0c; sudo EXTERNAL_URL"http://gitlab.example.com&quo…

androidstudio jni开发_初识NDK开发(一)

“ 前言&#xff1a;初学逆向 请多多指教 昨天在看雪论坛发了篇文章&#xff0c;被标记了优秀&#xff0c;不由得感叹 这一个月没有白学&#xff01; 剩下还有11个月 冲了”学习到的内容—1、了解了什么是NDK&#xff0c;以及在android studio中的环境搭建中注意的事项2、pthre…

http编程学习(C#)

《HTTP Programming Recipes for C# Bots》 第一章 选择GET还是POST取决于传送到服务器的数据的多少。GET传送的数据少&#xff0c;POST几乎对传送的数据无限制。 It is important to note that only one physical file is transferred per HTTP request. 每次HTTP请求只传送了…

服务器远程免密登录

1. 生成本地密钥 ssh-keygen2. 将密钥上传到服务器 ssh-copy-id -p port username192.128.128.128 3. 创建登录脚本 ssh -p port username192.128.128.128 转载于:https://www.cnblogs.com/yeran/p/11348045.html

如何触发AspxGridview的PageIndexChanged 客户端事件

&#xff1f;最近在使用AspxGridview控件时&#xff0c;遇到一个问题&#xff0c;就是在触发AspxGridview分页事件之后&#xff0c;需要在执行js事件&#xff0c;找了好久&#xff0c;在官网上找到处理的办法。 就是在cs页面设置变量在触发PageIndexChanged事件后&#xff0c;改…

Mysql 多表使用 Case when then 遇到的坑

前言&#xff1a; 在做一个订单导出时&#xff0c;遇到多表都含有state这个字段&#xff0c;含有多个状态首先想到的是&#xff1a; case colume when condition then result when condition then result when condition then result else result end 当正常试着写代码时会发现…

nginx反向代理原理及配置详解

nginx概述nginx是一款自由的、开源的、高性能的HTTP服务器和反向代理服务器&#xff1b;同时也是一个IMAP、POP3、SMTP代理服务器&#xff1b;nginx可以作为一个HTTP服务器进行网站的发布处理&#xff0c;另外nginx可以作为反向代理进行负载均衡的实现。 这里主要通过三个方面简…

小鱼易连电脑版_生活多么美好 篇十六:我的桌面改造,有绿植,有小鱼,有大音箱...

原标题&#xff1a;生活多么美好 篇十六&#xff1a;我的桌面改造&#xff0c;有绿植&#xff0c;有小鱼&#xff0c;有大音箱生活多么美好 篇十六&#xff1a;我的桌面改造&#xff0c;有绿植&#xff0c;有小鱼&#xff0c;有大音箱 2020-11-06 22:13:312点赞1收藏1评论想攒一…

菜鸟初涉SQL Server的总结

看完了一遍耿建玲老师的视频&#xff0c;讲的很多&#xff0c;一些细节的东西还是很难去把控。准备总结自己觉得无从下手&#xff0c;觉得很难去把控这个宏观和细节的平衡。但如果不去做这个工作的话&#xff0c;我可能永远都不能学会怎样去做好总结。总之&#xff0c;先这样去…

extjs4.0视频教程下载

发现www.uspcat.com 学习extjs4.0不错的论坛啊 http://www.uspcat.com/portal.php 视频教程下载 http://www.uspcat.com/forum.php?modviewthread&tid197&extra 转载于:https://blog.51cto.com/3450037/687004

开源依旧:再次分享一个进销存系统

开篇 我之前发过一篇博文《两天完成一个小型工程报价系统(三层架构)》&#xff0c;不少朋友向我要源码学习&#xff0c;后来久而久之忘记回复了。今天我再分享一个进销存系统&#xff0c;只为学习&#xff0c;没有复杂的框架和设计模式&#xff0c;有的是我个人的理解&#xff…

kotlin + springboot启用elasticsearch搜索

参考自&#xff1a; http://how2j.cn/k/search-engine/search-engine-springboot/1791.html?p78908 工具版本&#xff1a; elasticsearch 6.2.2、 kibana 6.2.2&#xff0c; 下载地址&#xff1a; elasticsearch、kibana 下载demo 1、kotlin版springboot项目创建 访问https:/…

insert 语句的选择列表包含的项多于插入列表中的项_如何定义和使用Python列表(Lists)

Python中最简单的数据集合是一个列表(list)。列表是方括号内用逗号分隔的任何数据项列表。通常&#xff0c;就像使用变量一样&#xff0c;使用符号为Python列表分配名称。 如果列表中包含数字&#xff0c;则不要在其周围使用引号。 例如&#xff0c;这是测试成绩的列表&#xf…

数据结构之主席树

这里讲静态的主席树&#xff0c;关于静态区间第k小。&#xff08;有兴趣的朋友还可以去看看我写的整体二分&#xff0c;代码实现略优于主席树我觉得&#xff0c;当然静态主席树是很好写的&#xff09; 题目描述&#xff1a; 题目描述 如题&#xff0c;给定N个正整数构成的序列&…

k-d tree算法的研究

By RaySaint 2011/10/12 动机 先前写了一篇文章《SIFT算法研究》讲了讲SIFT特征具体是如何检测和描述的&#xff0c;其中也提到了SIFT常见的一个用途就是物体识别&#xff0c;物体识别的过程如下图所示&#xff1a; 如上图(a)&#xff0c;我们先对待识别的物体的图像进行SIFT特…

Unicode,UTF-32,UTF-16,UTF-8到底是啥关系?

编码的目的&#xff0c;就是给抽象的字符赋予一个数值&#xff0c;好在计算机里面表示。常见的ASCII使用8bit给字符编码&#xff0c;但是实际只使用了7bit&#xff0c;最高位没有使用&#xff0c;因此&#xff0c;只能表示128个字符&#xff1b;ISO-8859-1(也叫Latin-1&#xf…

HDU 4407 sum 容斥原理

算法: 利用数据1...N的性质&#xff0c;求与P的互质的个数&#xff0c;位运算&#xff0c;容斥定理。。 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<iostream> #include<vector> #include<string> #include<ma…

uniapp中qrcode生成二维码后传的参数不见了_阿虚教你制作动态二维码,超详细教程!

这篇教程很早之前就答应几个粉丝要写&#xff0c;拖的有点久了。内容比较多&#xff0c;先上个目录阿虚的教程会迟到&#xff0c;但永远不会缺席。hahahahhaha...一、 先说一下今天要教的内容ʕ•̫͡•ོʔ•̫͡•ཻʕ•̫͡•ʔ•͓͡•ʔ 1.不准备教的类似这种二维码&#…

得到最后的自增长列的最后一个值

declare Table_name varchar(60) set Table_name aa; Select so.name Table_name, --表名字 sc.name Iden_Column_name, --自增字段名字 ident_current(so.name) curr_value, --自增字段当前值 ident_incr(so.name) incr_value, --自增字段增长值 ident_seed(so.name) s…

关于C语言中 字符串常量的问题

昨天晚上我编写了一段简短的C语言程序&#xff08;Linux环境下&#xff09;&#xff0c;编译能够通过&#xff0c;但是运行的时候老是报段错误。我当时非常郁闷&#xff0c;因为代码不长。其中主函数中有这样一句话&#xff1a; char *str"epmzm bpmzm qa eqtt bpmzm qa i…

WPF布局(2) 使用的DockPanel面板进行简单的布局

DockPanel 面板是根据外边缘进行控件的拉伸&#xff0c;DockPanel的LastChildFill属性设置为True 时&#xff0c;最后一个添加的控件将占满剩余空间。 <DockPanel LastChildFill"True"><Button DockPanel.Dock"Top">Top Button</Button>…

合并两个有序数组(重新开始)

在看分治算法的时候&#xff0c;想先自己写写合并的代码&#xff0c;还是不熟练啊&#xff01; 为了保持对代码的敏感度&#xff0c;要保持练习。加油&#xff01; public class JustDoIt0803 {/*** 分治算法学习前准备*/public static void main(String[] args) {int[] x new…