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

文章目录

  • 1.类库说明
  • 2.使用步骤
    • 2.1 创建一个Windows Form 项目
    • 2.2 安装类库
    • 2.3 编码
    • 2.4 效果
  • 3.该库支持的缓动函数
  • 4.代码下载

1.类库说明

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

  • 基于 net-standard 2.0
  • 提供 Fluent API,写代码非常舒服。
  • 支持多个参数同时参与动画。
  • 自带了十几种动画效果。
  • 代码非常精炼,是学习线程控制的好示例项目。

2.使用步骤

2.1 创建一个Windows Form 项目

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

2.2 安装类库

nuget-install App.Animations

2.3 编码

···csharp
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;

    //-------------------------------------------------------
    // Init
    //-------------------------------------------------------
    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 x
    private void btnAnimX_Click(object sender, EventArgs e)
    {
        var start = 100;  // x
        var 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 y
    private void btnAnimXY_Click(object sender, EventArgs e)
    {
        var start = new List<double> { 100, 10 };  // x, y
        var 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 color
    private void btnAnimColor_Click(object sender, EventArgs e)
    {
        var start = new List<double> { 255, 0, 0 };        // r, g, b
        var 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.该库支持的缓动函数

名称说明
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

4.代码下载

CSDN下载

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

项目3:从0开始的RPC框架

一. 基本概念 区别于传统的增删改查型的业务项目&#xff0c;本项目侧重于开发框架&#xff0c;并且涉及架构方面的技术知识点。 1. 什么是RPC&#xff1f; 远程过程调用&#xff08;Remote Procedure Call&#xff09;&#xff0c;是一种计算机通信协议&#xff0c;它允许程…

02眼电识别眼动--软件V1.0

对应视频链接点击直达 01项目点击下载&#xff0c;可直接运行&#xff08;含数据库&#xff09; 02眼电识别眼动--软件V1.0 对应视频链接点击直达构思结语其他以下是废话 构思 对于软件&#xff0c;主要就是接收数据、处理数据、储存和显示数据。 这是主要页面&#xff0c;…

爬取股票数据python

最近在搜集数据要做分析&#xff0c;一般的数据来源是一手数据&#xff08;生产的&#xff09;和二手数据&#xff08;来自其他地方的&#xff09;。 今天我们爬取同花顺这个网站的数据。url为&#xff1a;https://data.10jqka.com.cn/ipo/xgsgyzq/ 话不多说直接上代码。有帮…

QT项目实战: 五子棋小游戏

目录 内容介绍 一.添加头文件 二.画棋盘 1.宏定义 2.棋盘 三.画棋子 四.获取棋子摆放位置 五.判断棋子存在 六.判断胜利 1.变量定义和初始化 2.检查获胜条件 3.游戏结束处理 七.重绘 八.效果展示 九.代码 1.mainwindow.h 2.mainwindow.cpp 3.chessitem.h 4…

部署kubesphere报错

安装kubesphere报错命名空间terminted [rootk8smaster ~]# kubectl apply -f kubesphere-installer.yaml Warning: apiextensions.k8s.io/v1beta1 CustomResourceDefinition is deprecated in v1.16, unavailable in v1.22; use apiextensions.k8s.io/v1 CustomResourceDefini…

【Oracle篇】rman全库异机恢复:从单机环境到RAC测试环境的转移(第五篇,总共八篇)

&#x1f4ab;《博主介绍》&#xff1a;✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ &#x1f4ab;《擅长领域》&#xff1a;✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux&#xff0c;也在扩展大数据方向的知识面✌️…

车载以太网测试要测些什么呢?

车载以太网测试大致可以分成两块&#xff1a;TC8测试和以太网通信测试。 TC8测试全称TC8一致性测试&#xff0c;其规范由OPEN联盟制定&#xff0c;包括车载以太网ECU从物理层到应用层的各层互操作性以及常规基础功能服务。目的在于提高不同ECU之间的兼容性。 TC8测试规范可以…

C++STL---stack queue知识汇总

前言 C将stack和queue划归到了Containers中&#xff0c;但严格的说这并不准确&#xff0c;stack和queue实际上已经不再是容器了&#xff0c;而是属于容器适配器&#xff0c;适配器做的功能是转换&#xff0c;即&#xff1a;它不是直接实现的&#xff0c;而是由其他容器封装转换…

ruoyi若依二次开发怎么添加扫描自己的controller和mapper,配置三个地方即可。

概要 首先&#xff0c;添加在com.ruoyi外的类&#xff0c;项目启动后&#xff0c;调用接口&#xff0c;是会返回404找不到的。 必须要对这以外的接口类进行配置。目录结构如下&#xff1a; 解决步骤 一、添加 com.ruoyi.framework.config 下&#xff1a; // 指定要扫描的M…

深度学习革命-AI发展详解

深度学习革命 《深度学习革命》是一部引人深思的作品&#xff0c;详细讲述了深度学习技术的发展历程及其对各个行业的深远影响。由杰出的计算机科学家、深度学习专家撰写&#xff0c;这本书不仅适合科技领域的专业人士阅读&#xff0c;也为普通读者提供了一个理解人工智能革命…

LeetCode322.零钱兑换

文章目录 题目描述解题思路递归记忆化搜索动态规划另一种实现 题目描述 https://leetcode.cn/problems/coin-change/description/?envTypestudy-plan-v2&envIdtop-interview-150 给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及一个整数 amount …

考研规划,这么学上岸率比985的学霸还高!

我觉得985考研上岸率低是可以理解的 因为大家本科能考上985&#xff0c;那研究生大概率会报考和本学校差不多或者更高水平的院校&#xff0c;甚至清华北大都有人敢报&#xff0c;去实现自己本科没有实现的梦想。 而且985其实保研的比例很高&#xff0c;一般有30%的保研比例了…

亚马逊测评自养号技术全攻略:一站式解决方案

在跨境电商这行&#xff0c;产品测评可是个大问题。如果你的商品销量少&#xff0c;评价也不多&#xff0c;那买家就很难注意到你的产品&#xff0c;更别提下单购买了。毕竟&#xff0c;大家都喜欢跟风买那些已经有很多人好评的产品&#xff0c;而不是冒险尝试一个全新的。 我们…

基于JSP技术的社区疫情防控管理信息系统

你好呀&#xff0c;我是计算机学长猫哥&#xff01;如果有相关需求&#xff0c;文末可以找到我的联系方式。 开发语言&#xff1a;JSP 数据库&#xff1a;MySQL 技术&#xff1a;JSPJavaBeans 工具&#xff1a;MyEclipse、Tomcat、Navicat 系统展示 首页 用户注册与登录界…

《大宅门》特别活动走进李良济,开启探寻中医药文化之旅!

《大宅门》话剧将于6月14-16日在苏州湾大剧院上演&#xff0c;为了让大家了解到中医药知识&#xff0c;6月2日&#xff0c;李良济携手苏州湾大剧院举办《大宅门》特别活动“探寻中医药文化之旅”&#xff01; 6月2日下午&#xff0c;大家一起走进李良济&#xff0c;深度了解传统…

Django框架中级

Django框架中级 – 潘登同学的WEB框架 文章目录 Django框架中级 -- 潘登同学的WEB框架 中间件自定义中间件常用中间件process_view() 使用中间件进行URL过滤 Django生命周期生命周期分析 Django日志日志配置filter过滤器自定义filter 日志格式化formatter Django信号内置信号定…

51单片机STC89C52RC——1.1点亮一个LED

目录 STC单片机模块 LED模块 创建Keil项目 代码 效果 STC单片机模块 我们程序中要点亮的LED灯的位置如下图。 我们程序要用到的针脚如下图 LED模块 电路图如下 8个LED&#xff0c;全部点亮 每一bit位 都需要设置为0 二进制是0000 0000 。如果只点亮D1一个&#xff…

进口电动低温调节阀的作用-美国NOTON

进口电动低温调节阀在低温环境下的精确控制、广泛的工业应用、高效能设计、耐低温性和密封性、稳定性及可靠性以及安全性等方面发挥着重要作用。 进口电动低温调节阀的作用主要体现在以下几个方面&#xff1a; 低温环境下的精确控制&#xff1a; 进口电动低温调节阀是一种专为…

jenkins插件之Jdepend

JDepend插件是一个为构建生成JDepend报告的插件。 安装插件 JDepend Dashboard -->> 系统管理 -->> 插件管理 -->> Available plugins 搜索 Jdepend, 点击安装构建步骤新增执行shell #执行pdepend if docker exec phpfpm82 /tmp/composer/vendor/bin/pdepe…

怎么把wmv格式转换成mp4?四种将wmv转成MP4格式的方法

怎么把wmv格式转换成mp4&#xff1f;在微软操作系统中&#xff0c;我们经常会遇到wmv格式的视频文件。这种由微软开发的视频格式在微软平台上有很好的兼容性&#xff0c;但它也存在一些被忽视的缺点。首先&#xff0c;wmv格式支持数字版权管理&#xff0c;这意味着某些视频可能…