[UWP]使用SpringAnimation创建有趣的动画
1. 什么是自然动画
最近用弹簧动画(SpringAnimation)做了两个番茄钟,关于弹簧动画官方文档已经介绍得够详细了,这篇文章就摘录一些官方文档核心内容。
在传统UI中,关键帧动画(KeyFrameAnimation)是描述运动的主要方式。关键帧为设计人员和开发人员提供了尽可能多的用于定义开始、结束和内插的方式。虽然这在许多情况下非常有用,但关键帧动画动态性不够,其运动没有适应性,在任何情况下都具有相同的外观。

在上图的另一端是物理引擎,它能提供更为鲜活和动态的动画,但设计人员和开发人员对它的控制力较少,因此很难集成到传统UI中。
自然动画(NaturalMotionAnimation) 旨在帮助衔接起这种分离的状况,实现控制力和运动之间的平衡,对于重要的动画元素(如开始/完成)具有控制力,又能保持运动的自然和动态。
2. 什么是弹簧动画

从 Fall Creators Update 开始UWP引入了一种新的动画:弹簧动画(SpringAnimation)。 相对于传统的贝塞尔曲线动画,弹簧的运动不稳定,这通常会为观察它的人带来有趣而令人愉快的情绪反应。它公开以下功能:
• 定义开始和结束值。
• 使用 InteractionTracker 定义 InitialVelocity 并绑定到输入。
• 定义特定于运动的属性(如弹簧的 DampingRatio。)
具体来说:
• DampingRatio – 表示在动画中使用的弹簧运动的阻尼级别。
• Period – 弹簧执行单次振荡所花费的时间。
• Final、Starting Value – 定义弹簧运动的开始和结束位置(如果未定义,则开始值和最终值将是当前值)。
• Initial Velocity – 运动的编程初始速度。
其中DampingRatio是最重要的一个属性
| Damping Ratio Value | 描述 |
|---|---|
| DampingRatio = 0 | Undamped – 弹簧将振荡很长时间 |
| 0 < DampingRatio < 1 | Criticallydamped – 弹簧不会振荡 |
| DampingRatio = 1 | Criticallydamped – 弹簧不会振荡 |
| DampingRation > 1 | Overdamped – 弹簧将通过突然减速而不振荡快速到达其目的地 |
定义好这些属性之后,可以将弹簧动画的 NaturalMotionAnimation 传入 CompositionObject 的 StartAnimation 或 InteractionTracker InertiaModifier 的 Motion 属性。
3. 使用弹簧动画
使用弹簧动画的代码和一般合成动画很相似,只需要将动画改为名字带Spring的函数:
var springAnimation = _compositor.CreateSpringVector3Animation();
springAnimation.DampingRatio = 0.5f;
springAnimation.Period = TimeSpan.FromMilliseconds(200);
springAnimation.FinalValue = new Vector3(offset, 0);
visual.StartAnimation(nameof(visual.Offset), springAnimation);
上面的代码定义了一个位移的Spring动画,效果如下:

将Period改为50毫秒,DampingRatio改为0.85f,效果如下:

(又到了用白色背景的季节,偶尔用用全白背景也不错。)
4. 其它组合
在对 Offset 和 Scale/Size 进行动画处理的常见情况下,Windows 设计团队为不同类型的弹簧的 DampingRatio 和 Period 推荐了以下值:
| Property | Normal Spring | Dampened Spring | Less-Dampened Spring |
|---|---|---|---|
| Offset | Damping Ratio = 0.8 Period = 50 ms |
Damping Ratio = 0.85 Period = 50 ms |
Damping Ratio = 0.65 Period = 60 ms |
| Scale/Size | Damping Ratio = 0.7 Period = 50 ms |
Damping Ratio = 0.8 Period = 50 ms |
Damping Ratio = 0.6 Period = 60 ms |
有兴趣的可以下载Xaml-Controls-Gallery试试这些组合:

5. 结语
上面的动画可以安装我的番茄钟应用试玩一下,安装地址:
弹簧动画真是好玩到停不下来。如果和用户的输入关联,运动还能够根据最终用户的速度相应调节适应,这部分在官方文档有详细例子,因为我的番茄钟应用没什么必要做这功能就没深入研究了,有兴趣可以看看官方文档。
6. 参考
弹簧动画 - Windows UWP applications Microsoft Docs
自然运动动画 - Windows UWP applications Microsoft Docs
NaturalMotionAnimation Class (Windows.UI.Composition) - Windows UWP applications Microsoft Docs
KeyFrameAnimation Class (Windows.UI.Composition) - Windows UWP applications Microsoft Docs
microsoft_Xaml-Controls-Gallery
7. 源码
SpringTextView.xaml.cs at master
KonosubaView.xaml.cs at master
[UWP]使用SpringAnimation创建有趣的动画的更多相关文章
- [UWP]从头开始创建并发布一个番茄钟
1. 自己用的番茄钟自己做 在PC上我一直使用"小番茄"作为我的番茄钟软件,我把它打开后放在副显示器最大化,这样不仅可以让它尽到本分,而且还可以告诉我的同事"我正在专心工 ...
- CountUp.js – 让数字以非常有趣的动画方式显示
CountUp.js 无依赖的.轻量级的 JavaScript 类,可以用来快速创建以一种更有趣的动画方式显示数值数据.尽管它的名字叫 countUp,但其实可以在两个方向进行变化,这是根据你传递的 ...
- Windows Phone 8初学者开发—第22部分:用演示图板创建卷盘的动画
原文 Windows Phone 8初学者开发—第22部分:用演示图板创建卷盘的动画 第22部分: 用演示图板创建卷盘的动画 原文地址:http://channel9.msdn.com/Series/ ...
- WPF 有趣的动画效果
WPF 有趣的动画效果 这一次我要呈上一个简单的文章,关于给你的WPF apps加入美丽的光线动画,可是我对动画这东西可能有点入迷了. 实际上.我对动画如此的入迷,以至 ...
- [UWP]使用离散式关键帧播放动画
这篇文章介绍离散式关键帧,并使用它做些有趣的动画. 1. 什么是离散式关键帧 以DoubleAnimationUsingKeyFrames为例,它支持四种Double的关键帧,其中EasingDoub ...
- 有趣的动画视图集合:Android View Animations
Android View Animations这个项目收集了各种有趣的动画效果. 所有效果: Attension Flash, Pulse, RubberBand, Shake, Swing, Wob ...
- Expression Blend 的点滴(2)--利用可视化状态创建神奇翻转动画
原文:Expression Blend 的点滴(2)--利用可视化状态创建神奇翻转动画 首先,来看下实现后的效果: 关于VisulaState VisualState 指定控件处于特定状态时的外观.例 ...
- 有趣的动画swf 小鼠吃豆子
今天发现一个有趣的动画swf,小鼠吃豆子,呵呵 <object width="240" height="206" data="http://cd ...
- animation css3动画与CSS3 @keyframes担配使用创建往复平缓动画
通过 @keyframes 规则,您能够创建动画. 创建动画的原理是,将一套 CSS 样式逐渐变化为另一套样式. 在动画过程中,您能够多次改变这套 CSS 样式. 以百分比来规定改变发生的时间,或者通 ...
随机推荐
- Tomcat源码分析二:先看看Tomcat的整体架构
Tomcat源码分析二:先看看Tomcat的整体架构 Tomcat架构图 我们先来看一张比较经典的Tomcat架构图: 从这张图中,我们可以看出Tomcat中含有Server.Service.Conn ...
- ant path匹配原则
ant path匹配原则 又称路径匹配原则,spring中的相关策略类org.springframework.util.AntPathMatcher 路径模式使用了apache ant的路径样式 ap ...
- Web性能优化:雅虎35条
对web性能优化,一直知道是个很重要的方面,平时有注意到,但是对于雅虎35条是第一次听说,查了一下,发现平时都有用过,只是没有总结到一块,今天就总结一下吧. 雅虎35条: 1.[内容]尽量减少HTTP ...
- HashMap底层数据结构详解
一.HashMap底层数据结构 JDK1.7及之前:数组+链表 JDK1.8:数组+链表+红黑树 关于HashMap基本的大家都知道,但是为什么数组的长度必须是2的指数次幂,为什么HashMap的加载 ...
- 解决:Specifying a namespace in include() without providing an app_name和XXX is not a registered namespace问题
python3 Django 环境下,如果你遇到namespace没有注册以及在根目录下urls.py中的include方法的第二个参数namespace添加之后就出错的问题. 出错问题: 'Spec ...
- tp5中使用中间控制器代理路由,以避免创建过多的无用控制器方法
在写项目的时候偶尔会加载一些不需要传递参数的静态视图,例如 class Index extends Common { public function index() { return $this-&g ...
- CS184.1X 计算机图形学导论 第3讲L3V1
二维空间的变换 L3V1这一课主要讲了二维空间的变换,包括平移.错切和旋转. 缩放 缩放矩阵 使用矩阵的乘法来完成缩放 缩放矩阵是一个对角矩阵,对角线上的值对应缩放倍数 错切(shear) 错切可以将 ...
- POJ 3784 Running Median (模拟水过带翻译)
Description Moscow is hosting a major international conference, which is attended by n scientists fr ...
- 微信小程序前端样式WXSS书写
微信小程序前端样式WXSS书写 一. WXSS的简单介绍 WXSS(WeiXin Style Sheets)是一套样式语言,用于描述 WXML 的组件样式. 与 CSS 相比,WXSS 扩展的特性有: ...
- git基础命令详解
一些必须要知道的概念 git的三个工作区域:工作目录.暂存区.git仓库. 工作目录:其实就是本地文件磁盘上的文件或目录: 暂存区:是一个文件,保存了下次提交的文件列表信息,一般在git仓库目录中: ...