WPF动画 - Loading加载动画
存在问题:
最近接手公司一个比较成熟的产品项目开发(WPF桌面端),其中,在登陆系统加载时,60张图片切换,实现loading闪烁加载,快有密集恐惧症了!!!
代码如下:
private void LoadPics()
{
try
{
_storyboard = new Storyboard();
for (int i = ; i < ; i++)
{
ObjectAnimationUsingKeyFrames oauf = new ObjectAnimationUsingKeyFrames();
//ObjectAnimationUsingKeyFrames 可以对指定 Duration 内的一组 KeyFrames 中的 Object 属性值进行动画处理
BitmapImage bitmap = new BitmapImage();
bitmap.BeginInit();
bitmap.UriSource = new Uri("pack://application:,,,/jg.CloudCube.WPF;component/Resources/LoadingAnimation/loading" + (i + ) + ".png");
bitmap.CacheOption = BitmapCacheOption.Default;
bitmap.EndInit(); ImageBrush imgBrush = new ImageBrush(bitmap);
//读取图片文件
DiscreteObjectKeyFrame dokf = new DiscreteObjectKeyFrame();
//DiscreteObjectKeyFrame 通过使用离散内插,可以在前一个关键帧的 Object 值及其自己的 Value 之间进行动画处理。
dokf.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(i * ));
//KeyTime 获取或设置应到达关键帧的目标 Value 的时间
//这里每隔40毫秒设置一张图片,也就是每秒1000/40=25帧
dokf.Value = imgBrush;
oauf.KeyFrames.Add(dokf);
Storyboard.SetTargetProperty(oauf, new PropertyPath("(Rectangle.Fill)"));
//把动画应用到窗体的Rectangle中
Storyboard.SetTarget(oauf, RectDis);
//RectDis是Rectangle的名称
_storyboard.Children.Add(oauf);
//把ObjectAnimationUsingKeyFrames动画添加到Storyboard中
}
_storyboard.RepeatBehavior = RepeatBehavior.Forever;
}
catch (Exception ex)
{
var log = log4net.LogManager.GetLogger("Error");
log.Error(ex.Message, ex);
}
}
60张图:

这样的实现效果,实在对不住 WPF对动画那么好的支持。
解决方式:
下面使用WPF(Storyboard)只在xaml中,实现Loading加载闪烁动画。
代码如下:
<Window x:Class="TestWpf.Window4"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Title="Window4" Height="300" Width="300"> <Window.Resources>
<Style x:Key="FlashStyle" TargetType="{x:Type FrameworkElement}">
<Style.Triggers>
<EventTrigger RoutedEvent="Loaded">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetProperty="(FrameworkElement.Opacity)"
BeginTime="00:00:00" From="1" To="0" Duration="00:00:01.5" AutoReverse="True"
RepeatBehavior="Forever"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Style.Triggers>
</Style>
<Storyboard x:Key="StoryLeftToRight" RepeatBehavior="Forever" Duration="00:00:01.5">
<DoubleAnimationUsingKeyFrames
BeginTime="00:00:00"
Storyboard.TargetName="e1"
Storyboard.TargetProperty="(FrameworkElement.Opacity)">
<SplineDoubleKeyFrame KeyTime="00:00:00.0" Value="1" />
<SplineDoubleKeyFrame KeyTime="00:00:00.5" Value="0" />
<SplineDoubleKeyFrame KeyTime="00:00:01.0" Value="0" />
<SplineDoubleKeyFrame KeyTime="00:00:01.5" Value="0" />
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames
BeginTime="00:00:00"
Storyboard.TargetName="e2"
Storyboard.TargetProperty="(FrameworkElement.Opacity)">
<SplineDoubleKeyFrame KeyTime="00:00:00.0" Value="0" />
<SplineDoubleKeyFrame KeyTime="00:00:00.5" Value="1" />
<SplineDoubleKeyFrame KeyTime="00:00:01.0" Value="0" />
<SplineDoubleKeyFrame KeyTime="00:00:01.5" Value="0" />
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames
BeginTime="00:00:00"
Storyboard.TargetName="e3"
Storyboard.TargetProperty="(FrameworkElement.Opacity)">
<SplineDoubleKeyFrame KeyTime="00:00:00.0" Value="0" />
<SplineDoubleKeyFrame KeyTime="00:00:00.5" Value="0" />
<SplineDoubleKeyFrame KeyTime="00:00:01.0" Value="1" />
<SplineDoubleKeyFrame KeyTime="00:00:01.5" Value="0" />
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames
BeginTime="00:00:00"
Storyboard.TargetName="e4"
Storyboard.TargetProperty="(FrameworkElement.Opacity)">
<SplineDoubleKeyFrame KeyTime="00:00:00.0" Value="0" />
<SplineDoubleKeyFrame KeyTime="00:00:00.5" Value="0" />
<SplineDoubleKeyFrame KeyTime="00:00:01.0" Value="0" />
<SplineDoubleKeyFrame KeyTime="00:00:01.5" Value="1" />
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</Window.Resources> <Grid Background="DeepSkyBlue">
<StackPanel Orientation="Horizontal" Margin="20" VerticalAlignment="Bottom" HorizontalAlignment="Right">
<TextBlock Text="Loading " Style="{StaticResource FlashStyle}" Foreground="White" FontSize="20"/>
<StackPanel Orientation="Horizontal">
<StackPanel.Triggers>
<EventTrigger RoutedEvent="FrameworkElement.Loaded">
<BeginStoryboard Storyboard="{StaticResource StoryLeftToRight}" />
</EventTrigger>
</StackPanel.Triggers>
<Ellipse
Name="e1"
Width="5"
Height="5"
Margin="5,0,0,0"
HorizontalAlignment="Left"
Fill="White" />
<Ellipse
Name="e2"
Width="5"
Height="5"
Margin="5,0,0,0"
HorizontalAlignment="Left"
Fill="White" />
<Ellipse
Name="e3"
Width="5"
Height="5"
Margin="5,0,0,0"
HorizontalAlignment="Left"
Fill="White" />
<Ellipse
Name="e4"
Width="5"
Height="5"
Margin="5,0,0,0"
HorizontalAlignment="Left"
Fill="White" />
</StackPanel>
</StackPanel>
</Grid>
</Window>
实现效果:


技术要点:
DoubleAnimation属性介绍:
  Storyboard.TargetName:附加属性操作到指定的对象上;
  Storyboard.TargetProperty:要操作指定对象的属性;
  From..To :上述属性值的起始范围;
  Duration: 在多少时间内完成上述属性值的变化;
  RepeatBehavior:反复次数;
  AutoReverse:完成向迭代后是否按相反的顺序播放
System.Windows.Media.Animation提供三种动画类线性插值动画类(17个)、关键帧动画(22个)、路径动画(3个).
参考: http://www.cnblogs.com/libaoheng/archive/2012/04/23/2466242.html
WPF动画 - Loading加载动画的更多相关文章
- 2款不同样式的CSS3 Loading加载动画 附源码
		
原文:2款不同样式的CSS3 Loading加载动画 附源码 我们经常看到的Loading加载很多都是转圈圈的那种,今天我们来换一种有创意的CSS3 Loading加载动画,一种是声波形状的动画,另一 ...
 - HTML5 五彩圆环Loading加载动画实现教程
		
原文:HTML5 五彩圆环Loading加载动画实现教程 今天我们要来介绍一款效果很特别的HTML5 Loading加载动画,不像其他的Loading动画,这款Loading动画颜色很丰富,并且在转圈 ...
 - vue+elementUI+axios实现的全局loading加载动画
		
在项目中,很多时候都需要loading加载动画来缓解用户的焦虑等待,比如说,我打开了一个页面,而这个页面有很多接口请求,但浏览器的请求并发数就那么几个,再加上如果网速不行的话,那么这时候,用户很可能就 ...
 - QT自定义控件系列(二) --- Loading加载动画控件
		
本系列主要使用Qt painter来实现一些基础控件.主要是对平时自行编写的一些自定义控件的总结. 为了简洁.低耦合,我们尽量不使用图片,qrc,ui等文件,而只使用c++的.h和.cpp文件. 由于 ...
 - 16款纯CSS3实现的loading加载动画
		
分享16款纯CSS3实现的loading加载动画.这是一款实用的可替代GIF格式图片的CSS3加载动画代码.效果图如下: 在线预览 源码下载 实现的代码. html代码: <div clas ...
 - 10个样式各异的CSS3 Loading加载动画
		
前几天我在园子里分享过2款很酷的CSS3 Loading加载动画,今天又有10个最新的Loading动画分享给大家,这些动画的样式都不一样,实现起来也并不难,你很容易把它们应用在项目中,先来看看效果图 ...
 - 原生JS+ CSS3创建loading加载动画;
		
效果图: js创建loading show = function(){ //loading dom元素 var Div = document.createElement("div" ...
 - CSS动画实例:Loading加载动画效果(一)
		
一些网站或者APP在加载新东西的时候,往往会给出一个好看有趣的Loading图,大部分的Loading样式都可以使用CSS3制作出来,它不仅比直接使用gif图简单方便,还能节省加载时间和空间.下面介绍 ...
 - CSS动画实例:Loading加载动画效果(三)
		
3.小圆型Loading 这类Loading动画的基本思想是:在呈现容器中定义1个或多个子层,再对每个子层进行样式定义,使得其均显示为一个实心圆形,最后编写关键帧动画控制,使得各个实心圆或者大小发生改 ...
 
随机推荐
- BZOJ_4591_[Shoi2015]超能粒子炮·改_Lucas定理
			
BZOJ_4591_[Shoi2015]超能粒子炮·改_Lucas定理 Description 曾经发明了脑洞治疗仪&超能粒子炮的发明家SHTSC又公开了他的新发明:超能粒子炮·改--一种可以 ...
 - 【SCOI 2005】 最大子矩阵
			
[题目链接] 点击打开链接 [算法] 动态规划 我们发现,M只有两种取值,1和2,那么,只需分类讨论即可 当M = 1时,其实这个问题就成了就最大连续子段和的问题,只不过要选K段而已 用f[i][j] ...
 - UI:文件操作、通知中心
			
对文件的操作: #define PATH @"/Users/mac/Desktop/未命名文件夹" #define ERROR(a) if(a){NSLog(@"%@&q ...
 - asp.net MVC Model 类的主键 int类型、string类型、GUID类型。
			
在使用asp.net mvc进行定义 模型类的时候,一般情况下,我们都会定义一个属性为 int iD{get;set;} 或为int ClassNameID {get;set;},在这种情况下 1.I ...
 - Linux 软链接 硬链接 ln命令(简约说明版)
			
注意:路径使用绝对路径!! 解决方法: 当我们需要在不同的目录下用到同一个文件时,会用到以下命令. 命令:ln 作用:为某一个文件在另外一个位置建立一个同步的链接 语法:ln [option] 源文件 ...
 - Gym 100548K  Last Defence (数论)
			
题意:给定两个数,然后从第三个开始,每个数都是前两个数的差的绝对值,问这个序列中有多少个不同的元素. 析:这个和辗转相除法差不多,假设a > b那么a-b之间就有a/b个数,然后再计算a%b- ...
 - CodeForces 730H Delete Them (暴力)
			
题意:给定n个名字,然后让你删除 m 个,且这m个必须满足同一个表达式且其他的不满足,问你能不能找到一个满足条件. 析:很明显首先知道的是这 m 个如果第 i 个位置相同,那么就肯定选这个位置是最好的 ...
 - ubuntu 12.04 alt+tab无法切换窗口的问题(转载)
			
转自:http://www.2cto.com/os/201209/153282.html ubuntu 12.04 alt+tab无法切换窗口的问题 安装cpmpiz配置管理程序. sudo ...
 - Linux的gnu c下itoa的代替函数用sprintf(转载)
			
转自:http://www.linuxidc.com/Linux/2011-01/31600.htm int number = 12345; char string[25]; // itoa(numb ...
 - 【WIP】外汇与证券交易29个技术指标
			
创建: 2017/05/16 更新: 2017/05/30 更新: 2017/10/14 标题加上[WIP],增加创建时间 指标名称 函数原型(prototype) 参考与分析 (refer ...