[源码下载]

背水一战 Windows 10 (15) - 动画: 缓动动画

作者:webabcd

介绍
背水一战 Windows 10 之 动画

  • 缓动动画 - easing

示例
演示缓动(easing)的应用
Animation/EasingAnimation.xaml

<Page
x:Class="Windows10.Animation.EasingAnimation"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:Windows10.Animation"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"> <Grid Background="Transparent">
<StackPanel Margin="10 0 10 10"> <StackPanel Orientation="Horizontal">
<StackPanel Orientation="Horizontal">
<TextBlock FontSize="24" Text="Easing Function:" VerticalAlignment="Top" />
<!-- 用于选择 Easing Function -->
<ComboBox x:Name="cboEasingFunction" SelectionChanged="cboEasingFunction_SelectionChanged" Margin="10 0 0 0">
<ComboBoxItem>BackEase</ComboBoxItem>
<ComboBoxItem>BounceEase</ComboBoxItem>
<ComboBoxItem>CircleEase</ComboBoxItem>
<ComboBoxItem>CubicEase</ComboBoxItem>
<ComboBoxItem>ElasticEase</ComboBoxItem>
<ComboBoxItem>ExponentialEase</ComboBoxItem>
<ComboBoxItem>PowerEase</ComboBoxItem>
<ComboBoxItem>QuadraticEase</ComboBoxItem>
<ComboBoxItem>QuarticEase</ComboBoxItem>
<ComboBoxItem>QuinticEase</ComboBoxItem>
<ComboBoxItem>SineEase</ComboBoxItem>
</ComboBox>
</StackPanel>
<StackPanel Orientation="Horizontal" Margin="10 0 0 0">
<TextBlock FontSize="24" Text="Easing Mode:" VerticalAlignment="Top" />
<ComboBox x:Name="cboEasingMode" SelectionChanged="cboEasingMode_SelectionChanged" Margin="10 0 0 0">
<!-- 用于选择 Easing Mode -->
<ComboBoxItem>EaseIn</ComboBoxItem>
<ComboBoxItem>EaseOut</ComboBoxItem>
<ComboBoxItem>EaseInOut</ComboBoxItem>
</ComboBox>
</StackPanel>
</StackPanel> <StackPanel Orientation="Horizontal" Margin="0 30 0 0">
<StackPanel.Resources>
<Storyboard x:Name="storyboard">
<!-- 用于演示缓动动画的效果 -->
<DoubleAnimation x:Name="aniEasingDemo"
Storyboard.TargetName="easingDemo"
Storyboard.TargetProperty="(Canvas.Left)"
Duration="0:0:3"
RepeatBehavior="Forever"
From="0"
To="300" /> <!-- 用一个球显示缓动轨迹(X 轴代表时间) -->
<DoubleAnimation x:Name="aniBallX"
Storyboard.TargetName="ball"
Storyboard.TargetProperty="(Canvas.Left)"
Duration="0:0:3"
RepeatBehavior="Forever"
From="0"
To="100" /> <!-- 用一个球显示缓动轨迹(Y 轴代表当前时间点的缓动结果值) -->
<DoubleAnimation x:Name="aniBallY"
Storyboard.TargetName="ball"
Storyboard.TargetProperty="(Canvas.Top)"
Duration="0:0:3"
RepeatBehavior="Forever"
From="0"
To="100" />
</Storyboard>
</StackPanel.Resources>
<StackPanel>
<Canvas Name="graphContainer" RenderTransformOrigin="0,0.5" Height="100" Width="100">
<Canvas.RenderTransform>
<ScaleTransform ScaleY="-1" />
</Canvas.RenderTransform> <!-- 用于显示缓动曲线 -->
<Canvas Name="graph" /> <!-- 缓动曲线的 X 轴和 Y 轴 -->
<Line X1="0" Y1="0" X2="0" Y2="100" Stroke="Black" StrokeThickness="1" Width="1" Height="100" />
<Line X1="0" Y1="0" X2="100" Y2="1" Stroke="Black" StrokeThickness="1" Width="100" Height="1" /> <!-- 用一个球显示缓动轨迹 -->
<Ellipse Name="ball" Fill="Orange" Width="5" Height="5" />
</Canvas>
</StackPanel>
<StackPanel Margin="30 0 0 0">
<Border BorderBrush="Black" BorderThickness="1">
<Canvas Width="400" Height="100">
<!-- 用于演示缓动动画的效果 -->
<Rectangle Name="easingDemo" Width="100" Height="100" Fill="Blue" />
</Canvas>
</Border>
</StackPanel>
</StackPanel> </StackPanel>
</Grid>
</Page>

Animation/EasingAnimation.xaml.cs

/*
* 演示缓动(easing)的应用
*
* WinRT 支持 11 种经典的缓动:
* BackEase, BounceEase, CircleEase, CubicEase, ElasticEase, ExponentialEase, PowerEase, QuadraticEase, QuarticEase, QuinticEase, SineEase
*
* EasingMode 有 3 种:
* EaseIn, EaseOut, EaseInOut
*/ using Windows.Foundation;
using Windows.UI;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Media.Animation;
using Windows.UI.Xaml.Shapes; namespace Windows10.Animation
{
public sealed partial class EasingAnimation : Page
{
public EasingAnimation()
{
this.InitializeComponent(); this.Loaded += EasingAnimation_Loaded;
} void EasingAnimation_Loaded(object sender, Windows.UI.Xaml.RoutedEventArgs e)
{
cboEasingFunction.SelectedIndex = ;
cboEasingMode.SelectedIndex = ;
} private void cboEasingFunction_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
EasingChanged();
} private void cboEasingMode_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
EasingChanged();
} private void EasingChanged()
{
if (cboEasingFunction.SelectedIndex == - || cboEasingMode.SelectedIndex == -)
return; storyboard.Stop(); EasingFunctionBase easingFunction = null; // 确定 Easing Function
switch ((cboEasingFunction.SelectedItem as ComboBoxItem).Content.ToString())
{
case "BackEase":
// Amplitude - 幅度,必须大于等于 0,默认值 1
easingFunction = new BackEase() { Amplitude = };
break;
case "BounceEase":
// Bounces - 弹跳次数,必须大于等于 0,默认值 3
// Bounciness - 弹跳程度,必须是正数,默认值 2
easingFunction = new BounceEase() { Bounces = , Bounciness = };
break;
case "CircleEase":
easingFunction = new CircleEase();
break;
case "CubicEase":
easingFunction = new CubicEase();
break;
case "ElasticEase":
// Oscillations - 来回滑动的次数,必须大于等于 0,默认值 3
// Springiness - 弹簧的弹度,必须是正数,默认值 3
easingFunction = new ElasticEase() { Oscillations = , Springiness = };
break;
case "ExponentialEase":
easingFunction = new ExponentialEase();
break;
case "PowerEase":
easingFunction = new PowerEase();
break;
case "QuadraticEase":
easingFunction = new QuadraticEase();
break;
case "QuarticEase":
easingFunction = new QuarticEase();
break;
case "QuinticEase":
easingFunction = new QuinticEase();
break;
case "SineEase":
easingFunction = new SineEase();
break;
default:
break;
} // 确定 Easing Mode
switch ((cboEasingMode.SelectedItem as ComboBoxItem).Content.ToString())
{
case "EaseIn": // 渐进
easingFunction.EasingMode = EasingMode.EaseIn;
break;
case "EaseOut": // 渐出(默认值)
easingFunction.EasingMode = EasingMode.EaseOut;
break;
case "EaseInOut": // 前半段渐进,后半段渐出
easingFunction.EasingMode = EasingMode.EaseInOut;
break;
default:
break;
} // 用于演示缓动效果
aniEasingDemo.EasingFunction = easingFunction;
// 用于演示缓动轨迹
aniBallY.EasingFunction = easingFunction; // 画出当前缓动的曲线图
DrawEasingGraph(easingFunction); storyboard.Begin();
} /// <summary>
/// 绘制指定的 easing 的曲线图
/// </summary>
private void DrawEasingGraph(EasingFunctionBase easingFunction)
{
graph.Children.Clear(); Path path = new Path();
PathGeometry pathGeometry = new PathGeometry();
PathFigure pathFigure = new PathFigure() { StartPoint = new Point(, ) };
PathSegmentCollection pathSegmentCollection = new PathSegmentCollection(); // 0 - 1 之间每隔 0.005 计算出一段 LineSegment,用于显示此 0.005 时间段内的缓动曲线
for (double i = ; i < ; i += 0.005)
{
double x = i * graphContainer.Width;
double y = easingFunction.Ease(i) * graphContainer.Height; LineSegment segment = new LineSegment();
segment.Point = new Point(x, y);
pathSegmentCollection.Add(segment);
} pathFigure.Segments = pathSegmentCollection;
pathGeometry.Figures.Add(pathFigure);
path.Data = pathGeometry;
path.Stroke = new SolidColorBrush(Colors.Black);
path.StrokeThickness = ; graph.Children.Add(path);
}
}
}

OK
[源码下载]

背水一战 Windows 10 (15) - 动画: 缓动动画的更多相关文章

  1. 重新想象 Windows 8 Store Apps (19) - 动画: 线性动画, 关键帧动画, 缓动动画

    原文:重新想象 Windows 8 Store Apps (19) - 动画: 线性动画, 关键帧动画, 缓动动画 [源码下载] 重新想象 Windows 8 Store Apps (19) - 动画 ...

  2. WPF界面设计技巧(7)—模拟电梯升降的缓动动画

    原文:WPF界面设计技巧(7)-模拟电梯升降的缓动动画 如同Flash一样,WPF的亮点之一也在于其擅于表现平滑的动画效果,但以移动动画来说,仅凭简单的起始位置.目标位置,所产生的动画仍会非常生硬,这 ...

  3. 背水一战 Windows 10 (14) - 动画: 线性动画, 关键帧动画

    [源码下载] 背水一战 Windows 10 (14) - 动画: 线性动画, 关键帧动画 作者:webabcd 介绍背水一战 Windows 10 之 动画 线性动画 - ColorAnimatio ...

  4. Windows Phone开发(42):缓动动画

    原文:Windows Phone开发(42):缓动动画 前面在讨论关键帧动画的时候,我有意把几个带缓动动画的关键帧动画忽略掉,如EasingColorKeyFrame.EasingDoubleKeyF ...

  5. 背水一战 Windows 10 (42) - 控件(导航类): Frame 动画

    [源码下载] 背水一战 Windows 10 (42) - 控件(导航类): Frame 动画 作者:webabcd 介绍背水一战 Windows 10 之 控件(导航类) Frame 动画 示例An ...

  6. 背水一战 Windows 10 (17) - 动画: ThemeTransition(过渡效果)

    [源码下载] 背水一战 Windows 10 (17) - 动画: ThemeTransition(过渡效果) 作者:webabcd 介绍背水一战 Windows 10 之 动画 ThemeTrans ...

  7. 背水一战 Windows 10 (16) - 动画: ThemeAnimation(主题动画)

    [源码下载] 背水一战 Windows 10 (16) - 动画: ThemeAnimation(主题动画) 作者:webabcd 介绍背水一战 Windows 10 之 动画 PopInThemeA ...

  8. 【WPF学习】第五十一章 动画缓动

    线性动画的一个缺点是,它通常让人觉得很机械且不能够自然.相比而言,高级的用户界面具有模拟真实世界系统的动画效果.例如,可能使用具有触觉的下压按钮,当单击时按钮快速弹回,但是当没有进行操作时它们会慢慢地 ...

  9. JS基础知识——缓动动画

    基于距离的缓动动画 原理:设定起始位置  start 和终止位置 end,变化会越来越慢. 公式:start=start+(end-start)/10;     这个10不是固定的,想分成多少份就分成 ...

随机推荐

  1. jQuery编程的最佳实践

    好像是feedly订阅里看到的文章,读完后觉得非常不错,译之备用,多看受益. 加载jQuery 1.坚持使用CDN来加载jQuery,这种别人服务器免费帮你托管文件的便宜干嘛不占呢.点击查看使用CDN ...

  2. 跨域获取json一些理解[腾讯电商数据的拉取方式]

    如何跨域获取json数据源?我们都知道要有callback,具体callback是如何工作的呢?如果服务器端不接收callback,我们是不是就没有办法处理了呢?读完本文后相信你会有一个大体的了解. ...

  3. 跟我一起数据挖掘(21)——redis

    什么是Redis Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.从2010年3月15日起,Redis的开发工 ...

  4. 搞懂 SynchronizationContext(第一部分)【翻译】

    SynchronizationContext -MSDN 很让人失望 我不知道为什么,目前在.Net下关于这个类只有很少的资料.MSDN文档也只有很少的关于如何使用SynchronizationCon ...

  5. 每天一个linux命令(45):free 命令

    free命令可以显示Linux系统中空闲的.已用的物理内存及swap内存,及被内核使用的buffer.在Linux系统监控的工具中,free命令是最经常使用的命令之一. 1.命令格式: free [参 ...

  6. ng2048源码阅读

    ng2048源码阅读 Tutorial: http://www.ng-newsletter.com/posts/building-2048-in-angularjs.html Github: http ...

  7. Zabbix实现微信报警

    一.  申请企业微信账号,申请地址 https://qy.weixin.qq.com/ 二. 登陆企业微信账 图一 图二 2.添加微信账号 图一 图二 完成以上步骤后 就完成了微信账号的添加 三.新建 ...

  8. PHP从PHP5.0到PHP7.1的性能全评测

    本文是最初是来自国外的这篇:PHP Performance Evolution 2016, 感谢高可用架构公众号翻译成了中文版, 此处是转载的高可用架构翻译后的文章从PHP 5到PHP 7性能全评测( ...

  9. 【Win 10 应用开发】打印UI元素

    Windows App支持将UI界面进行打印的功能,这与浏览器中的打印网页的用途相近,其好处就是“所见即所得”,直接把界面上呈现的内容打印下来,比重新创建打印图像方便得多. 要在通用App中实现打印, ...

  10. 深入理解DOM事件机制系列第二篇——事件处理程序

    × 目录 [1]HTML [2]DOM0级 [3]DOM2级[4]IE[5]总结 前面的话 事件处理程序又叫事件侦听器,实际上就是事件的绑定函数.事件发生时会执行函数中相应代码.事件处理程序有HTML ...