一个简单好用的 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下载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/25701.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Django ORM的QuerySet:解锁数据库交互的魔法钥匙

用到此篇文章知识的几篇文章&#xff1a; Django ORM实战&#xff1a;模型字段与元选项配置&#xff0c;以及链式过滤与QF查询详解Django API开发实战&#xff1a;前后端分离、Restful风格与DRF序列化器详解 文章目录 前言一、什么是QuerySet&#xff1f;二、QuerySet 的用途三…

Dell服务器根据GPU温度调整风扇转速

前言 dell服务器自动风扇是根据CPU温度来调速的&#xff0c;我跑AI的时候cpu温度不高但是GPU温度很高导致显卡卡死PVE虚拟机直接挂起无法运行&#xff0c;我看了下也没有基于显卡温度调速的脚本&#xff0c;于是我就自己写了一个 基于ipmi工具 乌班图等linux先安装ipmi apt …

搭建vauditdemo靶场mysql为NO问题

一、问题 在搭建vauditdemo时&#xff0c;遇到如下显示问题&#xff1a; mysql版本检测为NO 二、解决 查找该方面问题时&#xff0c;并没有找到解决方法 然后换mysql版本换了五六个也没有解决问题 问了AI后给的答复有一条为将mysql改为mysqli 修改保存后解决问题 步骤如…

二分【1】二分查找框架 查找指定元素

目录 二分查找 基本思想 几种情况汇总 一。严格递增序列 1.查找本身 2.查找第一个大于等于自己的 3.查找第一个大于自己的 4.严格递减序列 二。有重复元素 1.取其中第一个出现的 2.取其中最后一个出现的 二分查找 基本思想 几种情况汇总 一。严格递增序列 1.查找本身…

作业-day-240607

思维导图 C编程 要求&#xff1a; 搭建一个货币的场景&#xff0c;创建一个名为 RMB 的类&#xff0c;该类具有整型私有成员变量 yuan&#xff08;元&#xff09;、jiao&#xff08;角&#xff09;和 fen&#xff08;分&#xff09;&#xff0c;并且具有以下功能&#xff1a;…

模板显式、隐式实例化和(偏)特化、具体化的详细分析

最近看了<The C Programing Language>看到了模板的特化&#xff0c;突然想起来<C Primer>上说的显式具体化、隐式具体化、特化、偏特化、具体化等概念弄得头晕脑胀&#xff0c;我在网上了找了好多帖子&#xff0c;才把概念给理清楚。 看着这么多叫法&#xff0c;其…

上位机图像处理和嵌入式模块部署(f407 mcu vs h750)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 在目前工业控制上面&#xff0c;f103和f407是用的最多的两种stm32 mcu。前者频率低一点&#xff0c;功能少一点&#xff0c;一般用在低端的嵌入式设…

C语言详解(文件操作)1

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f4a5;&#x1f4a5;个人主页&#xff1a;奋斗的小羊 &#x1f4a5;&#x1f4a5;所属专栏&#xff1a;C语言 &#x1f680;本系列文章为个人学习…

通过在idea上搭建虚拟hadoop环境使用MapReduce做词频去重

idea上的MapReduce ​ 一般在开发中&#xff0c;若是等到环境搭配好了再进行测试或者统计数据&#xff0c;数据处理等操作&#xff0c;那会很耽误时间&#xff0c;所以一般都是2头跑&#xff0c;1波人去在客户机上搭建环境&#xff0c;1波人通过在idea上搭建虚拟hadoop环境&am…

Vue3父组件如何访问子组件属性和方法

本篇内容主要是父组件如何访问子组件的属性和方法 文章目录 子组件 //son.vue代码const list (info) >{console.log(info) }const name ref("XXXX")//子组件向父组件暴露了一个方法&#xff0c;然后父组件就可以去使用子组件里面的一些属性和方法了 //子组件向…

奇安信停服,国内还有什么可用的高防么?

这里写自定义目录标题 背景DDOS怎么办&#xff1f;方案推荐总结 背景 继前段时间百度云加速通知免费服务&#xff0c;6月底奇安信也将停止服务&#xff0c;到时候国内将几乎不存在免费好用的高防CDN了&#xff1b;类似的事情还有阿里云和腾讯云的一年期免费SSl证书也都停止供应…

C++:SLT容器-->deque

C:SLT容器-->deque 1. 构造函数2. deque 赋值操作3. deque 大小操作4. deque 插入和删除5. deque 容器数据存取6. deque 排序操作 双端数组&#xff0c;可以对头部和尾部进行插入删除操作 需要导入头文件#include <deque> 1. 构造函数 deque deqT; // 默认构造函数 de…

vue-2 组件传值

组件关系分类 父子关系非父子关系 父子通信流程 父组件通过props将数据传递给子组件 给子组件以添加属性的方式传值子组件内部通过 props 接收模板中直接使用 props 接收的值 父组件 Parent.vue <template><div class"parent" style"border: 3px s…

CST Studio Suite 2020 软件安装教程、安装包下载

CST Studio Suite 2020 安装教程 安装包下载 复制链接在浏览器打开 https://www.qqres.com/3150.html CST Studio Suite 是由Dassault Systmes公司开发的一套电磁场仿真软件。它应用于电子、通信、天线设计、射频与微波、电磁兼容性 (EMC)、电磁干扰 (EMI) 等领域。 CST St…

Unity协程学习心得

前言 个人总结的一些Unity协程学习心得&#xff0c;如有不对请在评论区指出一起学习&#xff01;感谢。 在Unity编程中谈到异步逻辑&#xff0c;可以考虑使用协程来实现。协程&#xff08;Coroutine&#xff09;在Unity中的主要作用就是把一个任务暂停&#xff08;挂起&#…

智慧园区建设方案(Word)

1. 楼栋管理 2. 物业管理 3. 安防管理 4. 门禁管理 5. 停车管理 6. 能源管理 7. 环保管理 8. 园区生活服务 9. 招商管理 10. 收费中心 11. 园区地图 12. 门户网站 软件整套原件获取&#xff1a;本文末个人名片。

使用DPO微调大模型Qwen2详解

简介 基于人类反馈的强化学习 (Reinforcement Learning from Human Feedback&#xff0c;RLHF) 事实上已成为 GPT-4 或 Claude 等 LLM 训练的最后一步&#xff0c;它可以确保语言模型的输出符合人类在闲聊或安全性等方面的期望。但传统的RLHF比较复杂&#xff0c;且还需要奖励…

BabylonJS 6.0文档 Deep Dive 动画(四):通过动画排序制作卡通片

一种最为直接的方法是为每个动画剪辑&#xff08;Animatin Clip&#xff09;指定开始时间&#xff0c;最终形成一个卡通动画&#xff08;Cartoon&#xff09;。 1. 设计 1.1 概述 动画的脚本如下&#xff1a; 摄像机显示了一栋带门的建筑物。摄像机靠近门并停止。门打开&am…

掌控数据流:深入解析 Java Stream 编程

Java 8 引入了一种新的抽象称为流&#xff08;Stream&#xff09;&#xff0c;它可以让你以一种声明的方式处理数据。Java 8 Stream API 可以极大提高 Java 程序员的生产力&#xff0c;使代码更简洁&#xff0c;更易读&#xff0c;并利用多核架构进行外部迭代。这里将详细介绍 …

【NoSQL数据库】Redis简介

Redis Redis简介 Redis关系型数据库和非关系型数据库Redis 简介redis速度快的原因 Redis 配置Linux 源码安装redis命令工具 关系型数据库和非关系型数据库 关系型数据库&#xff08;Relational Database&#xff09;和非关系型数据库&#xff08;Non-Relational Database&…