单刀直入,今天要讲的是自己写的一个WPF动画例子。我们在看下最终效果~


最近在重看WPF编程宝典2010,在练习第15章动画性能例子时有了些想法。原始例子如下: 
 
原始例子(打包了整个15章的) 
它是一个可动态改变小球动画帧速的程序~那我能不能让小球一直发射?能不能改变小球的轨迹? 
所有就有了现在的程序,我们先改变背景和文字(请原谅消音枪的Piu不知道是那个字) 
 
首先把原来的文本框输入改为Slider,不然输入个文字在点程序就JJ了~然后我们把前台的动画放到后台来实现,每次都创建一个小球。开始动画,结束后在删除~代码如下:

  <Grid>
<Grid Margin="5">
<Border BorderBrush="#FFA44545" BorderThickness="2">
<Canvas Name="Cvs" ClipToBounds="True" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Background="#FFB5D7DE">
<Canvas.Resources>
<Style TargetType="Ellipse">
<Setter Property="Fill" Value="Red"></Setter>
<Setter Property="Width" Value="10"></Setter>
<Setter Property="Height" Value="10"></Setter>
</Style>
</Canvas.Resources>
</Canvas>
</Border>
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Bottom" Margin="0,0,0,40" Orientation="Horizontal">
<TextBlock Margin="5,0">动画帧率:</TextBlock>
<Slider x:Name="Sdr_FrameRate" Width="100" Maximum="100" Minimum="10" Value="60" ToolTip="{Binding Value, ElementName=Sdr_FrameRate}" IsSnapToTickEnabled="True" IsMoveToPointEnabled="True"/>
</StackPanel>
<Button Name="btnRepeat" HorizontalAlignment="Center" VerticalAlignment="Bottom" Content="Piu piu Piu" Padding="5" Click="btnRepeat_Click" Margin="0,0,0,10"></Button>
</Grid>
</Grid>
  private void btnRepeat_Click(object sender, RoutedEventArgs e)
{
//创建一个圆形的小球
Ellipse elp = new Ellipse();
Cvs.Children.Add(elp); DoubleAnimation leftAnimation = new DoubleAnimation(0, 600, TimeSpan.FromSeconds(5)); leftAnimation.Completed += leftAnimation_Completed;
//设置动画的帧速
Timeline.SetDesiredFrameRate(leftAnimation, (int)Sdr_FrameRate.Value);
//开始宽度位移动画
elp.BeginAnimation(Canvas.LeftProperty, leftAnimation); DoubleAnimation topAnimation = new DoubleAnimation(400, 0, TimeSpan.FromSeconds(2.5))
{
DecelerationRatio = 1,
AutoReverse = true
};
Timeline.SetDesiredFrameRate(topAnimation, (int)Sdr_FrameRate.Value);
//开始高度位移动画
elp.BeginAnimation(Canvas.TopProperty, topAnimation);
} /// <summary>
/// 运行完动画后从画布删除小球
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void leftAnimation_Completed(object sender, EventArgs e)
{
if (Cvs.Children.Count > 0)
Cvs.Children.RemoveAt(0);
}

在这里我发现一个问题,当前角度实际是因为高度时间为宽度的一半,所以有曲线的动画。并且动画用的固定的窗体高宽,那么当窗体大小发生变化时就会很奇怪(注意下张图小球消失的地方)~ 
 
所以我们把600,400换成窗体的ActualWidth和ActualHeight(不要使用width和height,因为它们不会随窗体一起改变大小)。 
那我们能不能尝试改变的抛物线的弧度呢?(也就是Height动画的时间)假设想使用三种弧度方式固定、递增和随机来动画小球~并且可控制递增的间隔。先来改前台:

          <StackPanel x:Name="stackPanel" HorizontalAlignment="Center" VerticalAlignment="Bottom" Orientation="Horizontal" Margin="0,0,0,66">
<TextBlock TextWrapping="Wrap" Text="间隔:"/>
<Slider x:Name="Sdr_Interval" Minimum="0.1" Maximum="1" TickFrequency="0.1" Width="100" Margin="5,0,0,0" ToolTip="{Binding Value, ElementName=Sdr_Interval}" IsSnapToTickEnabled="True" IsMoveToPointEnabled="True"/>
</StackPanel>
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Bottom" Margin="0,0,0,40" Orientation="Horizontal">
<TextBlock>动画角度:</TextBlock>
<RadioButton Margin="5,0" Checked="RadioButton_Checked" Tag="1">固定</RadioButton>
<RadioButton x:Name="radioButton" Margin="5,0" Checked="RadioButton_Checked" Unchecked="RadioButton_Unchecked" Tag="2" IsChecked="True">递增</RadioButton>
<RadioButton Margin="5,0" Checked="RadioButton_Checked" Tag="3">随机</RadioButton>
<TextBlock Margin="5,0">动画帧率:</TextBlock>
<Slider x:Name="Sdr_FrameRate" Width="100" Maximum="100" Minimum="10" Value="60" ToolTip="{Binding Value, ElementName=Sdr_FrameRate}" IsSnapToTickEnabled="True" IsMoveToPointEnabled="True"/>
</StackPanel>

第一个好解决我们就使用2.5秒,第二个我们使用1秒每次小球+0.1秒,这样弧度就会增加。效果如下: 

现在我们发现了些问题,一个是间隔的Slider只和递增有关,切到别的模式应该不显示。所有我们使用Blend加个切换动画。然后小球是在文字的后方的,应该设置下Zindex。最后当切会递增时,它的初始角度应该恢复。OK,我们修改如下~ 
 
这个发现了一个奇怪的问题就是设置间隔Slider的刻度,0.1、0.2都没有问题但0.3就变成了 
 
还有小球是在控件之下文字之上~另外就是我想给Slider指向显示加上前缀文字,如:当前间隔为:0.2。惭愧以上几个问题没解决如果有人知道,还麻烦告诉我下~ 
好了,进入最后一项。随机!我打算让小球的大小、时间和颜色全部都随机。代码如下:

            //递增初始时间
double duraTime = 1;
//判断模式
switch (AnageMode)
{
case 1:
duraTime = 2.5;
break;
case 2:
duraTime = timeSpan += Sdr_Interval.Value;
break;
case 3:
random = new Random((int)DateTime.Now.Ticks);
duraTime = random.Next(1, 10);
elp.Height = elp.Width = random.Next(3, 20);
elp.Fill = new SolidColorBrush(new Color()
{
A = 255,
R = (byte)random.Next(0, 255),
G = (byte)random.Next(0, 255),
B = (byte)random.Next(0, 255)
});
break;
} DoubleAnimation topAnimation = new DoubleAnimation(this.ActualHeight, 0, TimeSpan.FromSeconds(duraTime))
{
DecelerationRatio = 1,
AutoReverse = true
};

真正最终效果如下: 

其实,你本地全屏看的固定的有尾巴像流星有没有?而降低帧速率时,动画会很卡!你可能发现了随机的时候只有一个方向,而最开始是两个方向的~对,只要我们同时加两个小球,并把动画反过来就好了!最后附上下载,有错误的地方还望指点~

带你一起Piu Piu Piu~的更多相关文章

  1. 【piu~】制作一只变形小鸡~

    在http://codepen.io/pick上看到的,,,具体是谁忘了,反正我只截了最萌的一段,作者越改越不萌ಥ_ಥ 谷哥哥随便一搜就有很多好玩的,度娘就...(  ̄ ▽ ̄)o╭╯☆#╰ _─﹏─) ...

  2. Sprite Kit 入门教程

    Sprite Kit 入门教程  Ray Wenderlich on September 30, 2013 Tweet 这篇文章还可以在这里找到 英语, 日语 If you're new here, ...

  3. yii2.0表单自带验证码

    Yii2.0的自带的验证依赖于GD2或者ImageMagick扩展. 使用步骤如下: 第一步,控制器: 在任意controller里面重写方法

  4. C#+HtmlAgilityPack+XPath带你采集数据(以采集天气数据为例子)

    第一次接触HtmlAgilityPack是在5年前,一些意外,让我从技术部门临时调到销售部门,负责建立一些流程和寻找潜在客户,最后在阿里巴巴找到了很多客户信息,非常全面,刚开始是手动复制到Excel, ...

  5. 带你实现开发者头条APP(五)--RecyclerView下拉刷新上拉加载

    title: 带你实现开发者头条APP(五)--RecyclerView下拉刷新上拉加载 tags: -RecyclerView,下拉刷新,上拉加载更多 grammar_cjkRuby: true - ...

  6. 带你实现开发者头条APP(四)---首页优化(加入design包)

    title: 带你实现开发者头条APP(四)---首页优化(加入design包) tags: design,Toolbar,TabLayout,RecyclerView grammar_cjkRuby ...

  7. 带你实现开发者头条APP(三) 首页实现

    title: 带你实现开发者头条APP(三) 首页实现 tags: 轮播广告,ViewPager切换,圆形图片 grammar_cjkRuby: true --- 一.前言 今天实现开发者头条APP的 ...

  8. [C#] 了解过入口函数 Main() 吗?带你用批处理玩转 Main 函数

    了解过入口函数 Main() 吗?带你用批处理玩转 Main 函数 目录 简介 特点 方法的参数 方法的返回值 与批处理交互的一个示例 简介 我们知道,新建一个控制台应用程序的时候,IDE 会同时创建 ...

  9. MFC中如何画带实心箭头的直线

    工作中遇到话流程图的项目,需要画带箭头的直线,经过摸索,解决:思路如下: (1) 两个点(p1,p2)确定一个直线,以直线的一个端点(假设p2)为原点,设定一个角度 (2)以P2为原点得到向量P2P1 ...

随机推荐

  1. WCF编写时候的测试

    1右击WCF创建到使用到发布这篇文章中的类库项目中的接口类实现文件添加断点 2右击WCF创建到使用到发布这篇文章中的WCF服务网站设为启动项并允许 3右击WCF创建到使用到发布这篇文章中的WPF项目调 ...

  2. 菜鸟初试水--JQuery基础

    此文仅作入门级文章,望大神们高抬贵手! JQuery: 它是一套跨浏览器的JavaScript库,简化HTML与JavaScript之间的操作. JQuery的用途: ①访问和操作DOM元素: 使用j ...

  3. mysql不区分大小写解决

    今天遇到一个情况,前台验证用户昵称的时候发现无论输入Fred fred亦或是FrEd 都会显示昵称存在(这并不是我所期望的结果) debug发现并不是程序问题 hibernate也只是吧hql装成my ...

  4. Java学习之基本数据类型

    基本类型,或者叫做内置类型,是JAVA中不同于类的特殊类型.它们是我们编程中使用最频繁的类型.java是一种强类型语言,第一次申明变量必须说明数据类型,第一次变量赋值称为变量的初始化. 1. Java ...

  5. linux杂记(四)热键[Tab],[ctrl]-c,[ctrl]-d,在线求助man page/info page

    [Tab]按键 他具有[命令补全](接在一串指令的第一个字后面)与[档案补齐](接在第一串指令的第二字以后时)的功能.如 [KANO@kelvin ~]$ ca[tab][tab] cabextrac ...

  6. Let's Format Css Documents

    每次想参考一些好看网站的时候,打开css文档都是一行的,琢磨了下就自己写了块短短的代码,各路Java大神别笑我呀.^_^ 复制粘贴控制台的输出就好了.(瞬间觉得跟上大神的脚步了←_←) package ...

  7. Latex beamer

    使用明体(gbsn)和楷体(gkai)两种字型.以下的编程是一开始的宣告,并自动生成第一张封面投影片. \documentclass[cjk]{beamer}\usepackage{CJKutf8}\ ...

  8. mysql 特殊语句

    1.获取下当前mysql的插件目录select @@plugin_dir 2.mysql移动文件 select load_file('文件路径') into dumpfile '导出路径' 3.des ...

  9. Foreach & add remove elements

    参考 http://stackoverflow.com/questions/11058384/how-to-delete-specific-array-elements-from-within-a-f ...

  10. android小知识之圆角ListView

    有些东西看多了,就厌烦了:extjs对我这种感觉最为强烈.甚至,有时觉得设计之殇是审美疲劳.直角看多了,就想看看圆角,不知何时,这几年刮起了一阵阵的圆角设计风:CSS新标准纳入圆角元素,iphone中 ...