一个简单好用的 C# Easing Animation 缓动动画类库

2024-06-10 21:36

本文主要是介绍一个简单好用的 C# Easing Animation 缓动动画类库,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 1.类库说明
  • 2.使用步骤
    • 2.1 创建一个Windows Form 项目
    • 2.2 安装类库
    • 2.3 编码
    • 2.4 效果
  • 3. 扩展方法
    • 3.1 MoveTo 动画
    • 3.2 使用回调函数的Color动画
    • 3.3 属性动画
    • 3.4 自定义缓动函数
  • 4.该库支持的内置缓动函数
  • 5.代码下载

1.类库说明

App.Animations 类库是一个很精炼、好用的 csharp easing 动画库

  • 基于 net-standard 2.0
  • 提供 Fluent API,写代码非常舒服。
  • 支持多个参数同时参与动画。
  • 自带 30+ 缓动动画效果。
  • 支持自定义缓动动画。
  • 支持无限循环。
  • 支持自动返回。
  • 支持扩展方法,简化动画创建
  • 代码非常精炼,是学习线程控制的好示例项目。

2.使用步骤

2.1 创建一个Windows Form 项目

App.Animations 类库是基于 net-standard 2.0开发的,不依赖于其它任何类库,是可以跨平台使用的。这里以windows form项目为例,演示ui动画。窗口创建好后,在界面上拖入控件,效果如下:

在这里插入图片描述

2.2 安装类库

nuget-install App.Animations

2.3 编码

using App.Animations;
using App.Utils;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace AnimationForm
{public partial class Form1 : Form{Animator _ani;public Form1(){InitializeComponent();BindEnum(this.cmbType1, typeof(AnimationType));BindEnum(this.cmbType2, typeof(AnimationType));}//-------------------------------------------------------// Combobox <-> Enum//-------------------------------------------------------void BindEnum(ComboBox cmb, Type enumType){var infos = enumType.GetEnumInfos();cmb.Items.Clear();foreach (var info in infos){cmb.Items.Add(info);}cmb.SelectedIndex = 0;}T GetEnum<T>(ComboBox cmb) where T : Enum{return (T)(cmb.SelectedItem as EnumInfo).Value;}//-------------------------------------------------------// Run//-------------------------------------------------------private void btnStop_Click(object sender, EventArgs e){if (_ani != null)_ani.Stop();}// Animation on xprivate void btnAnimX_Click(object sender, EventArgs e){var start = 100;  // xvar end   = 300;var type1 = GetEnum<AnimationType>(cmbType1);var type2 = GetEnum<AnimationType>(cmbType2);var dur1 = (long)numDur1.Value;var dur2 = (long)numDur2.Value;_ani = new Animator().SetInterval((int)numInterval.Value).AddPath(type1, start, end, dur1).AddPath(type2, end, start, dur2).SetFrameEvent((values) =>{Action action = () => {label1.Left = (int)values[0];label1.Text = string.Format("{0:000}", values[0]);};this.Invoke(action);}).SetEndEvent((_) => Trace.WriteLine("Animation end.")).Start();}// Animation on yprivate void btnAnimXY_Click(object sender, EventArgs e){var start = new List<double> { 100, 10 };  // x, yvar end   = new List<double> { 300, 100 };var type1 = GetEnum<AnimationType>(cmbType1);var type2 = GetEnum<AnimationType>(cmbType2);var dur1 = (long)numDur1.Value;var dur2 = (long)numDur2.Value;_ani = new Animator().SetInterval((int)numInterval.Value).AddPath(type1, start, end, dur1).AddPath(type2, end, start, dur2).SetFrameEvent((values) =>{Action action = () => {label1.Left = (int)values[0];label1.Top = (int)values[1];label1.Text = string.Format("({0:000},{1:000})", values[0], values[1]);};this.Invoke(action);}).SetEndEvent((values) => Trace.WriteLine("Animaion end.")).Start();}// Animation on colorprivate void btnAnimColor_Click(object sender, EventArgs e){var start = new List<double> { 255, 0, 0 };        // r, g, bvar end   = new List<double> { 0, 255, 255 };var type1 = GetEnum<AnimationType>(cmbType1);var type2 = GetEnum<AnimationType>(cmbType2);var dur1 = (long)numDur1.Value;var dur2 = (long)numDur2.Value;_ani = new Animator().SetInterval((int)numInterval.Value).AddPath(type1, start, end, dur1).AddPath(type2, end, start, dur2).SetFrameEvent((values) =>{Action action = () => {label1.ForeColor = Color.FromArgb((int)values[0], (int)values[1], (int)values[2]);label1.Text = string.Format("({0:0},{1:0},{2:0})", values[0], values[1], values[2]);};this.Invoke(action);}).SetEndEvent((values)=>{Action action = () => {label1.ForeColor = Color.FromArgb((int)values[0], (int)values[1], (int)values[2]);label1.Text = string.Format("({0:0},{1:0},{2:0})", values[0], values[1], values[2]);};this.Invoke(action);}).Start();}}
}

2.4 效果

在这里插入图片描述

3. 扩展方法

3.1 MoveTo 动画

this.block.MoveTo(new Point(70, 100), new Point(150, 50), 1000, EasingType.Linear); // use moveto extension function to apply animation.

3.2 使用回调函数的Color动画

var startColor = new List { 255, 0, 0 };
var endColor = new List { 0, 255, 255 };
this.block.Animate(startColor, endColor, 1000, (t, vs) => t.BackColor = ToColor(vs)); // use callback to modify property.

3.3 属性动画

this.picBall.Animate(500, -50, 1000, t => t.Left);

3.4 自定义缓动函数

Func<double, double> func = (v) => Math.Sin(vMath.PI2); // define a sin easing function
anim1 = this.picBall.Animate(600, -50, 5000, (t,v) => t.Left = (int)v, EasingType.Linear, infinity:true); // X linear animation
anim2 = this.picBall.Animate(100, 200, 5000, (t,v) => t.Top = (int)v, easingFunc: func, infinity: true); // Y custom animation
在这里插入图片描述

4.该库支持的内置缓动函数

名称说明
Linear线性
BackEaseIn拉后 ease in
BackEaseOut拉后 ease out
BackEaseInOut拉后 ease in and ease out
BounceEaseIn弹性 ease in
BounceEaseOut弹性 ease out
BounceEaseInOut弹性 ease in and ease out
ElasticEaseIn橡皮筋 ease in
ElasticEaseOut橡皮筋 ease out
ElasticEaseInOut橡皮筋 ease in and ease out
QuadraticEaseIn平方 ease in
QuadraticEaseOut平方 ease out
QuadraticEaseInOut平方 ease in and ease out
CubicEaseIn立方 ease in
CubicEaseInOut立方 ease in and cubic ease out
CubicEaseOut立方 ease out
QuarticEaseIn四次方 ease in
QuarticEaseOut四次方 ease out
QuarticEaseInOut四次方 ease in and ease outut
QuinticEaseIn五次方 ease in
QuinticEaseOut五次方 ease out
QuinticEaseInOut五次方 ease in and ease out
ExponentialEaseIn指数 ease in
ExponentialEaseOut指数 ease out
ExponentialEaseInOut指数 ease in and ease out
SinusoidalEaseIn正弦曲线 ease in
SinusoidalEaseOut正弦曲线 ease out
SinusoidalEaseInOut正弦曲线 ease in and ease out
CircularEaseIn圆形 ease in
CircularEaseOut圆形 ease out
CircularEaseInOut圆形 ease in and ease out

5.代码下载

CSDN下载

这篇关于一个简单好用的 C# Easing Animation 缓动动画类库的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1049326

相关文章

C#读取本地网络配置信息全攻略分享

《C#读取本地网络配置信息全攻略分享》在当今数字化时代,网络已深度融入我们生活与工作的方方面面,对于软件开发而言,掌握本地计算机的网络配置信息显得尤为关键,而在C#编程的世界里,我们又该如何巧妙地读取... 目录一、引言二、C# 读取本地网络配置信息的基础准备2.1 引入关键命名空间2.2 理解核心类与方法

基于Qt开发一个简单的OFD阅读器

《基于Qt开发一个简单的OFD阅读器》这篇文章主要为大家详细介绍了如何使用Qt框架开发一个功能强大且性能优异的OFD阅读器,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 目录摘要引言一、OFD文件格式解析二、文档结构解析三、页面渲染四、用户交互五、性能优化六、示例代码七、未来发展方向八、结论摘要

最好用的WPF加载动画功能

《最好用的WPF加载动画功能》当开发应用程序时,提供良好的用户体验(UX)是至关重要的,加载动画作为一种有效的沟通工具,它不仅能告知用户系统正在工作,还能够通过视觉上的吸引力来增强整体用户体验,本文给... 目录前言需求分析高级用法综合案例总结最后前言当开发应用程序时,提供良好的用户体验(UX)是至关重要

C#实现文件读写到SQLite数据库

《C#实现文件读写到SQLite数据库》这篇文章主要为大家详细介绍了使用C#将文件读写到SQLite数据库的几种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下... 目录1. 使用 BLOB 存储文件2. 存储文件路径3. 分块存储文件《文件读写到SQLite数据库China编程的方法》博客中,介绍了文

基于Python实现PDF动画翻页效果的阅读器

《基于Python实现PDF动画翻页效果的阅读器》在这篇博客中,我们将深入分析一个基于wxPython实现的PDF阅读器程序,该程序支持加载PDF文件并显示页面内容,同时支持页面切换动画效果,文中有详... 目录全部代码代码结构初始化 UI 界面加载 PDF 文件显示 PDF 页面页面切换动画运行效果总结主

使用C#如何创建人名或其他物体随机分组

《使用C#如何创建人名或其他物体随机分组》文章描述了一个随机分配人员到多个团队的代码示例,包括将人员列表随机化并根据组数分配到不同组,最后按组号排序显示结果... 目录C#创建人名或其他物体随机分组此示例使用以下代码将人员分配到组代码首先将lstPeople ListBox总结C#创建人名或其他物体随机分组

无线路由器哪个品牌好用信号强? 口碑最好的三个路由器大比拼

《无线路由器哪个品牌好用信号强?口碑最好的三个路由器大比拼》不同品牌在信号覆盖、稳定性和易用性等方面各有特色,如何在众多选择中找到最适合自己的那款无线路由器呢?今天推荐三款路由器让你的网速起飞... 今天我们来聊聊那些让网速飞起来的路由器。在这个信息爆炸的时代,一个好路由器简直就是家庭网编程络的心脏。无论你

在C#中合并和解析相对路径方式

《在C#中合并和解析相对路径方式》Path类提供了几个用于操作文件路径的静态方法,其中包括Combine方法和GetFullPath方法,Combine方法将两个路径合并在一起,但不会解析包含相对元素... 目录C#合并和解析相对路径System.IO.Path类幸运的是总结C#合并和解析相对路径对于 C

C#中字符串分割的多种方式

《C#中字符串分割的多种方式》在C#编程语言中,字符串处理是日常开发中不可或缺的一部分,字符串分割是处理文本数据时常用的操作,它允许我们将一个长字符串分解成多个子字符串,本文给大家介绍了C#中字符串分... 目录1. 使用 string.Split2. 使用正则表达式 (Regex.Split)3. 使用

C# Task Cancellation使用总结

《C#TaskCancellation使用总结》本文主要介绍了在使用CancellationTokenSource取消任务时的行为,以及如何使用Task的ContinueWith方法来处理任务的延... 目录C# Task Cancellation总结1、调用cancellationTokenSource.