前言

  首先,来对比下传统动画和Composition动画。看图就能明白composition动画的优势太明显就像官方说的大幅度的降低了动画的实现难度和代码量。

  传统的动画,就拿最常见的就是过度动画:进入和退出,如果你的动画很复杂,那代码量简直酸爽。而且这个动画在被执行期间又被你执行了,处理不当,就duang!duang!的给你报错提示要执行就得停止前面的动画。

现在Composition动画完美解决了这个问题。进入过度效果我顺序播放一次,退出过度效果我反序播放一次就搞定了。妈妈再也不用担心我的动画了。亲,这还是可以N飞的哟!!

1.Composition旋转动画

第一步:创建一个Composition

       var composition = ElementCompositionPreview.GetElementVisual(this).Compositor;

第二步:创建动画

       //--------------------------------------------------------------------
// 1.创建一个ScalarAnimation和一个线性缓动函数。
//--------------------------------------------------------------------
var animation = composition.CreateScalarKeyFrameAnimation();
var easing = composition.CreateLinearEasingFunction(); //--------------------------------------------------------------------
// 1.设置动画,从0度旋转360度,3秒钟,重复播放
//--------------------------------------------------------------------
animation.InsertKeyFrame(0.0f,0.0f);
animation.InsertKeyFrame(1.0f,360.0f,easing);
animation.Duration = TimeSpan.FromMilliseconds();
animation.IterationBehavior = AnimationIterationBehavior.Forever;

第三部:开始动画

       //--------------------------------------------------------------------
// 1.获取button的Visual
// 2.开始动画,中心旋转
//--------------------------------------------------------------------
var buttonVisual = ElementCompositionPreview.GetElementVisual(AnimatingButton);
buttonVisual.CenterPoint = new Vector3((float)AnimatingButton.ActualWidth/2.0f,(float)AnimatingButton.ActualHeight/2.0f,0.0f);
buttonVisual.StartAnimation(nameof(buttonVisual.RotationAngleInDegrees),animation);

  

2.Composition动画正序和反序播放,并行执行动画。

1.正反序播放动画

  其实就是在上次的代码上修改了下。首先声明改了下范围。

public sealed partial class MainPage : Page
{
public MainPage()
{
this.InitializeComponent(); Loaded += (s, a) =>
{
InitComposition();
}; } Compositor composition;
ScalarKeyFrameAnimation animation;
Visual buttonVisual;
SpriteVisual visual;
private void InitComposition()
{
//--------------------------------------------------------------------
// 1.获取当前的对象的可视化对象用来创建复合器
// 2.创建一个SpriteVisual,用它来承载我们的Content和Brush
//--------------------------------------------------------------------
composition = ElementCompositionPreview.GetElementVisual(this).Compositor;
visual = composition.CreateSpriteVisual();
//--------------------------------------------------------------------
// 1.我们要设置visual的大小为150*150
// 2.另外我们设置它的偏移为50,50
// 注意这个偏移是相对于它的父来说的。
// 3.最后我们设置Bursh到这个visual上,填充任意颜色。
//--------------------------------------------------------------------
visual.Size = new Vector2(, );
visual.Offset = new Vector3(, , );
visual.Brush = composition.CreateColorBrush(Colors.Black);
//--------------------------------------------------------------------
// 这个方法用来把我们的visual设置到page上
//--------------------------------------------------------------------
ElementCompositionPreview.SetElementChildVisual(this,visual);
//--------------------------------------------------------------------
// 1.创建一个ScalarAnimation和一个线性缓动函数。
//--------------------------------------------------------------------
animation = composition.CreateScalarKeyFrameAnimation();
var easing = composition.CreateLinearEasingFunction();
//--------------------------------------------------------------------
// 1.开动画,从0度旋转360度,3秒钟,重复播放
//--------------------------------------------------------------------
animation.InsertKeyFrame(0.0f, 0.0f);
animation.InsertKeyFrame(1.0f, 360.0f, easing);
animation.Duration = TimeSpan.FromMilliseconds();
animation.IterationBehavior = AnimationIterationBehavior.Forever;
//--------------------------------------------------------------------
// 1.创建一个旋转的中心点。
// 2.设置动画要操作的属性,这里旋转当然是角度
// 注意这里使用的是nameof(),就避免了某些方法设置目标属性使用字符串而导致不能智能提示的问题
//--------------------------------------------------------------------
visual.CenterPoint = new Vector3(visual.Size.X/2.0f,visual.Size.Y/2.0f,);
visual.StartAnimation(nameof(visual.RotationAngleInDegrees),animation);
//--------------------------------------------------------------------
// 1.获取button的Visual
// 2.开始动画
// 3.ElementCompositionPreview.GetElementVisual(合成器对象) //-------------------------------------------------------------------- buttonVisual = ElementCompositionPreview.GetElementVisual(AnimatingButton); <----这个地方同样的道理,你要给谁做动画和特效就要获取它
buttonVisual.CenterPoint = new Vector3((float)AnimatingButton.ActualWidth / 2.0f, (float)AnimatingButton.ActualHeight / 2.0f, 0.0f); //-------------------------------------------------------------------- // 创建一个组执行动画 //-------------------------------------------------------------------- CompositionScopedBatch csb = composition.CreateScopedBatch(CompositionBatchTypes.Animation); buttonVisual.StartAnimation(nameof(buttonVisual.RotationAngleInDegrees), animation); visual.StartAnimation(nameof(visual.RotationAngleInDegrees), animation); csb.End(); }

  在上次的代码的按钮上添加点击事件。大家看上面的代码就知道从头到尾就只有一个名字为animation的标量关键帧动画。

     /// <summary>
/// 正向和反向执行动画
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void AnimatingButton_Click(object sender, RoutedEventArgs e)
{
if (animation.Direction==Windows.UI.Composition.AnimationDirection.Normal)
{
animation.Direction = Windows.UI.Composition.AnimationDirection.Alternate;
}
else
{
animation.Direction = Windows.UI.Composition.AnimationDirection.Normal;
}
buttonVisual.StartAnimation(nameof(buttonVisual.RotationAngleInDegrees), animation);
visual.StartAnimation(nameof(visual.RotationAngleInDegrees), animation);
}

[UWP-小白日记13]Composition动画的更多相关文章

  1. [UWP小白日记-9]页面跳转过度动画(二)

    又打算动手写了 [UWP小白日记-6]页面跳转过度动画 上次写的,这次随着学习的进度使用新的玩法. 最近在搞GIT的学习,结果把好好的项目玩坏,都不知道当时是怎么想的拿在写的APP来玩GIT,害我重写 ...

  2. 小白日记13:kali渗透测试之服务扫描(三)-SMTB扫描、防火墙识别、负载均衡识别、WAF识别

    SMTP扫描 SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式.SMTP协议属于TCP/ ...

  3. [UWP小白日记-12]使用新的Composition API来实现控件的阴影

    前言 看了好久官方的Windows UI Dev Labs示例好久才有点心得,真是头大.(其实是英语幼儿园水平(⊙﹏⊙)b) 真的网上关于这个API的资料可以说几乎没有. 正文 首先用这东西的添加WI ...

  4. [UWP小白日记-6]页面跳转过度动画

    前言 在学习中发现页面导航默认是没有过度动画的,直接就导航过去太粗暴了( ̄へ ̄),于是打算上动画结果不言而喻自己进了坑完全不懂动画,然后就是各种疯狂(´・_・`)的搜索资料看了后终于有点头绪. 再后来 ...

  5. [UWP小白日记-11]在UWP中使用Entity Framework Core(Entity Framework 7)操作SQLite数据库(一)

    前言 本文中,您将创建一个通用应用程序(UWP),使用Entity Framework Core(Entity Framework 7)框架在SQLite数据库上执行基本的数据访问. 准备: Enti ...

  6. [UWP小白日记-8]一些零碎的东西

    设置启动窗口大小 直接上代码了没什么好解释的了,既然能设置最小,那铁定就能设置最大 public MainPage() { //设定窗口启动显示大小 ApplicationView.Preferred ...

  7. [UWP小白日记-10]程序启动屏(ios解锁既视感)

    讲一下 微软爸爸的开发者大会2016又暴了个表达式动画和Windows.UI.Composition的API,好叼的样子. 官方示例库GitHub 目前是懵逼状态,好复杂.脑细胞已经在地府排队了. ( ...

  8. [UWP小白日记-5]转换MVA学院的XML字幕为SRT

    开源地址:第二版开源地址GIT 暂时用不了了,在最新的WIN10 10586.494系统上回闪退,正在酝酿第二版 O(∩_∩)O哈哈~ 新版已经完工:第二版 地方MVA上好多教程,但是微软的所有中国网 ...

  9. [UWP小白日记-15]在UWP手机端实时限制Textbox的输入

    说实话重来没想到验证输入是如此的苦逼的一件事情.     网上好多验证都是在输入完成后再验证,我的想法是在输入的时候就限制输入,这样我就不用再写代码来验证了 应为是手机端,所以不用判断其他非法字符,直 ...

随机推荐

  1. Hypeiron Planning/Essbase修改规划类型名称

    1.修改planning关系库 1.1--修改Plan_type,例如将type_name “Plan1”修改为”Plan1ts”,提交 SELECT * FROM hsp_plan_type FOR ...

  2. 站点维护使用app_offline.htm页面提供友好的更新提示

    进行站点维护时为了以一个友好的方式提示给用户,比如什么“本网站正在更新”等等的信息可以建立一个叫app_offline.htm 的静态HTM页面文件,其中修改成你要临时显示的内容,将其放在你的应用的根 ...

  3. MEF插件系统中通信机制的设计和实现

    MEF插件系统中通信机制的设计和实现 1.背景 一般的WinForm中通过C#自带的Event机制便能很好的实现事件的注册和分发,但是,在插件系统中却不能这么简单的直接用已有的类来完成.一个插件本不包 ...

  4. 开始DDD

    如何开始DDD(完) 连续写了两篇文章,这一篇我想是序的完结篇了.结合用户注册的例子再将他简单丰富一下.在这里只添加一个简单需求,就是用户注册成功后给用户发一封邮件.补充一下之前的代码 public ...

  5. Function.prototype.toString

    语法:fn.toString(indentation) 改方法返回当前函数源代码的字符串,而且还可对此字符串进行操作,比如: function num(){ }; var str = num.toSt ...

  6. C#实现函数根据返回类型重载

    一直以来都很奇怪为何C#不能直接支持函数返回值重载, 比如如下两个函数是编译不过的 Public Class DbHelper { Public Static int ExecuteScalar(); ...

  7. wcf契约随记

    1.wcf契约分为:服务契约,操作契约,消息契约.数据契约 -------------------服务契约: [ServiceContract( Name = "name_IUser&quo ...

  8. mvc上传头像加剪裁功能

    asp.net mvc上传头像加剪裁功能 正好项目用到上传+剪裁功能,发上来便于以后使用. 我不能告诉你们其实是从博客园扒的前台代码,哈哈. 前端是jquery+fineuploader+jquery ...

  9. 使用ReSharper打造团队代码

    当前标签: 漂亮代码   请看高质量的代码——更新 Leo C.W 2014-04-01 19:16 阅读:544 评论:5   我们的终极编码规范 Leo C.W 2014-03-31 22:34 ...

  10. 6 MySQL视图

    目录: 1. 视图概述 1.1 为什么引入视图 1.2 什么是视图 1.3 视图的好处 1.4 视图的分类 2. 视图的建立和删除 3. 实验 1. 视图概述 1.1 为什么引入视图[1] 问题:假如 ...