WPF控制动画开始、停止、暂停和恢复
1、闲言
好久也没更新一博客了,自己有点发懒,同时确实这几个月来也有点忙。风机监测软件,项目中,有这样一个小需求:正常风机在旋转的时候,上位机软要做一个风机的图片,让它不停地旋转,一但检测到下面风机停止了,上位机软件界面的风机图片也要跟着停止,并且风机图片的旋转速度最好是能够与真实的速度成比例关系,这样软件才更有逼格一点。就是实现这样一个效果,看下图1,左边是一个状态指示,没有做动画,只是做了一个图片的切换,效果还看得过去吧。

图1 风机旋转动画
2、动画制作
在WPF做动画前,首先超码得有3个东西:动画要做什么样子的动作(基本的有旋转,平移,放缩等等),是什么类型的动画持续多久(某个数值变化,颜色变化,3D变化之类的),最后是一个故事板。这就相当于我们开发人员做个导演,而界面上的控件就是我们请来的演员,所有的窗体就是我们场地。故事板就是表演的剧本了,一切准备就绪后,就可以开始请演员们做事了(在这里,我要它转,而且是360度的转,有残忍了)。
3个东西准备的相应的代码下:
private RotateTransform rt_FanRotate = new RotateTransform(); //做旋转动
private DoubleAnimation da_FanRotate = new DoubleAnimation(); //数值类型
private Storyboard sb_FanRotate = new Storyboard(); //故事板
接下来就开始安排旋转动作了,代码如下:
rt_FanRotate.CenterX = img_FanRotate.Width / ; //旋转中心
rt_FanRotate.CenterY = img_FanRotate.Height / ;
img_FanRotate.RenderTransform = rt_FanRotate; //将此旋转变换赋给风机图片控件
动作安排好看,就要开始准备要这个动作怎么做了,做多久了。平时我们自己转圈,有转90度的,有转180度的,还有转720度(这家伙可能是抽风了)。并且还有指定这个旋转的时间,有时候要它慢慢地完成,有时要它瞬间完成,在这里我要这个风机图片从0度开始转,转360度,用时300ms,代码如下:
da_FanRotate.Duration = new Duration(TimeSpan.FromMilliseconds());
da_FanRotate.From = ;
da_FanRotate.By = ;
动作安排好了,动作的怎么动,动多久也指定好了,可以让风机图片上场了。这个时候,导演就开始叫人了,代码如下:
DependencyProperty[] propertyChain = new DependencyProperty[]
{
Image.RenderTransformProperty,
RotateTransform.AngleProperty
}; Storyboard.SetTargetName(da_FanRotate, img_FanRotate.Name);
Storyboard.SetTargetProperty(da_FanRotate, new PropertyPath("(0).(1)", propertyChain));
sb_FanRotate.Children.Add(da_FanRotate);
这段代码的理解比前面的可能稍微难一点点,不怕,我们一步步来分析。1~5行是定义了一个依赖属性链:Image的变化属性,和旋转变化的角度属性,它将是我们动画要控制的属性。说简单点,就是我们要让图片旋转变化。按理来讲,前面我们已经指定了图片的旋转动作,和它的时间,这里为什么还要在故事板上指定一下呢。因为故事板不止可以控制一个对象,它可以控制多个。这很好理解决,我们的电影电视不可能一直是一个人演吧(好像也有这样的电影,邪恶了!)。所以当我们的风机图片上场的时候,就应该给导演说,我是某某,来演XX的。因此就出现了7、8行的代码。个人的表述能力有限,如果把你说蒙了,请过来打我!!
这个时候一切准备就绪了,请开始我们的表演吧。不过还别急,我们还要设定一下,这个故场景要持续多长时间,也就是我们的一个境头要多长时间,代码如下:
sb_FanRotate.Duration = new Duration(TimeSpan.FromMilliseconds());
sb_FanRotate.RepeatBehavior = RepeatBehavior.Forever;
上面代码设定为故事的时间为600ms,不停地循环(小时候看的电视剧《西游记后传》就有类似的镜头,孙悟空拿个棒子不停地打打打打打!!)。
这个时候是真的全部准备就绪了,导演开始喊,Action!!代码如下:
sb_FanRotate.Begin(img_FanRotate);
这个时候,代开始RUN你的VS,就可以开心地发现在你的所指定的对象开始转了,应该很开心吧,当了一回导演了,小激动一把。
3、控制动画
① 开始动画
按理来讲,第2节已经说明了如何开始动画了,不就是Begin吗?但是如果这样子单纯地Begin,动画是停不下来的。有的家伙演得比较投入,完全停不下来的那种。网上就有很多人碰到这种问题,如下图,这是CSDN博客上的一个博友总结的办法。不得不说这博友很是粗爆,别人不就是停不下来吗,直接把人家给踢走了(Remove)。当然我们是文明人,不能像他那样子。

图2 博友动画停止
解决办法:我们在开始动画的时,要使用如下Begin的方法:
sb_FanRotate.Begin(img_FanRotate, true);//如果只有一个动画, img_FanRotate可以写成this
后面一个true参数是让动画可控制。这样子问题都解决了。
② 停止、暂停和恢复动画
有了上面对开始动画的说明,停止、暂停和恢复动画就很简单了,全部可调用官方的函数,如下:
sb_FanRotate.Pause(img_FanRotate); //暂停动画
sb_FanRotate.Resume(img_FanRotate);//恢复动画
sb_FanRotate.Stop(img_FanRotate); //停止动画
百度知道上有人提出类似的问题,只可惜这哥们被踩了15次,大家也真是狠。这哥们其实挺冤的,不是Stop方法有问题,而是那些踩的人用的Begin方法不正确,在这里给这位哥们平个冤,希望过两天能收到他的感谢信。

图3 百度知道停止动画
③ 控制动画速度
这个也很容易,官方有自带的方法,如下:
sb_FanRotate.SetSpeedRatio(img_FanRotate, fanMeasure.FanSpeed1 / );
总结
平时碰到问题,大家可百度,但是百度不到了,不要灰心,我们还可以查MSDN,或者是Google。另:本人初学WPF,如上文中有理解不当之处,敬请指正,定虚心接受。若言语有所不妥,还请谅解。代码取自项目,故源码不能分享,请见谅!
WPF控制动画开始、停止、暂停和恢复的更多相关文章
- CSS3属性animation-play-state控制动画运行或暂停的技巧
animation-play-state介绍 animation-play-state 属性规定动画正在运行还是暂停. div{ animation-play-state:paused; -webki ...
- 利用ManualResetEvent来来控制异步调用的打印的线程的暂停和恢复(转)
利用ManualResetEvent来来控制异步调用的打印的线程的暂停和恢复 打印过程可能很长,这时候有可能需要暂停下来做一些事情,然后回来继续接着打印 打印过程中有2个线程:一个是程序运行的主线程, ...
- 用css3动画 @keyframes里设置transform:rotate(); 控制动画暂停和运动用属性:animation-play-state:paused暂停,在微信和safari里设置paused无效,在QQ里是正常的
这几天遇到了两个很奇葩的问题,终于找到原因,趁还记得解决方法,赶紧记下来: 用css3动画 @keyframes里设置transform:rotate(); 控制动画暂停和运动可以用属性:animat ...
- Java/Android倒计时(开始,暂停,恢复,停止)
由于要做暂停和恢复,这里我就没有使用Android的CountDownTimer,而是用了Java的Timer.所以,这个方法在java肯定是通用.我也外加了Android独有的Service,有些计 ...
- CALayer的上动画的暂停和恢复
CHENYILONG Blog CALayer上动画的暂停和恢复 #pragma mark 暂停CALayer的动画-(void)pauseLayer:(CALayer*)layer{CFTimeIn ...
- Quartz的任务的临时启动和暂停和恢复
Quartz的任务的临时启动和暂停和恢复 在项目中需要手动启停某些服务,那么需要有一个控制这些任务的类.由于任务是有Quartz控制的,我们只需要通过Quartz的相关的API实现相关的功能即可. p ...
- 暂停和恢复Activity Android
暂停和恢复Activity(Pausing and Resuming an Activity) 在正常的应用程序使用,前台activity有时会被其他可视化组件遮挡,从而 造成activity的暂停. ...
- WPF弹性模拟动画
原文:WPF弹性模拟动画 我们此次将要制作模拟物理中的弹性现象的交互动画,我们让一个小球向鼠标点击位置移动,这个移动的轨迹不是简单的位移,而是根据胡克定律计算得出的. 胡克定律:F=-kd F代表弹性 ...
- 【Android Developers Training】 16. 暂停和恢复一个Activity
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
随机推荐
- mysql表生成JavaBean
MySQLToBean.java package org.just.util; import java.io.File; import java.io.FileInputStream; import ...
- [TYVJ1728/BZOJ3224]普通平衡树-替罪羊树
Problem 普通平衡树 Solution 本题是裸的二叉平衡树.有很多种方法可以实现.这里打的是替罪羊树模板. 此题极其恶心. 前驱后继模块需要利用到rank模块来换一种思路求. 很多细节的地方容 ...
- SQLServer中的执行计划缓存由于长时间缓存对性能造成的干扰
本文出处:http://www.cnblogs.com/wy123/p/7190785.html (保留出处并非什么原创作品权利,本人拙作还远远达不到,仅仅是为了链接到原文,因为后续对可能存在的一些错 ...
- java 关键字final
一.最终的意思,可以修饰类,方法,变量.特点: A:它修饰的类,不能被继承. B:它修饰的方法,不能被重写. C:它修饰的变量,是一个常量.二.面试相关: 1.局部变量基本类型 值不能发生改变 例如: ...
- nyoj_120: 校园网络
题目链接 要加边使一个图成为一个强连通分量,只需加max(出度为0的点数,入度为0的点数)条边(可以不使用tarjan算法).题目数据有点弱,网上一些人所谓 结果 = 出度为0的点的数量+入度为0的点 ...
- 操作系统,银行家算法模拟实现(Windows 环境 C++)
计算机操作系统课设需要,写了两个下午的银行家算法(陷在bug里出不来耽误了很多时间),参考计算机操作系统(汤子瀛) 实现过程中不涉及难度较大的算法,仅根据银行家算法的思想和步骤进行实现.以下为详细步骤 ...
- (转)如何在maven的pom.xml中添加本地jar包
1 maven本地仓库认识 maven本地仓库中的jar目录一般分为三层:图中的1 2 3分别如下所示: 1 groupId 2 artifactId 3 version 4 jar包的依赖 如果要将 ...
- PHP将数据导出Excel表中(投机型)
1.简介 如何利用最简单粗糙暴力的方法将数据写入Excel文件中呢? 因为ms word和excel的文档都支持html文本格式,因此我们可以基于这个原理采用html文本格式进行数据的输出. 在htm ...
- SQL Server ---T-SQl基本语句
T-SQL 是 SQL-Server 的结构化查询语言. 基本数据操作语言. 基础语句 先创建表 我后面的列子都是用的这一个表,列名啥的 就大概看看吧~~ 纯粹为了学习语句,语法~~所以先创建个表吧~ ...
- Java操作Excel和Word
这是一个URL它提供了Java项目所推荐的处理此项目所用的类库 http://www.oschina.net/project/tag/258/excel-tools?company=0&sor ...