WPF动画的使用
前言
弹幕是什么?这里是使用动画将控件弹起来,通过C#提供的多样化动画类型,我们可以制做出丰富的界面效果。主要有基于时间的动画和基于属性的动画。
1、Animatable
一个提供动画支持的抽象类。
继承
Object
DispatcherObject
DependencyObject
Freezable
Animatable
2、DoubleAnimation 类
在指定的 Duration 期间使用线性内插对两个目标值之间的 Double 属性值进行动画处理。是一种简单线性动画,仅由变化起点、变化终点、变化幅度、变化时间4个要素构成。三个细节:开始值(From)、结束值(To)和整个动画执行的时间(Duration)。
private void Button_Click(object sender, RoutedEventArgs e)
{DoubleAnimation daX = new DoubleAnimation();DoubleAnimation daY = new DoubleAnimation();//设置反弹BounceEase be = new BounceEase();be.Bounces = 3;be.Bounciness = 3;daY.EasingFunction = be;//指定起点daX.From = 300D;daY.From = 300D;//指定终点//Random r = new Random();//daX.To = r.NextDouble() * 300;//daY.To = r.NextDouble() * 300;//指定时长Duration duration = new Duration(TimeSpan.FromMilliseconds(2000));daX.Duration = duration;daY.Duration = duration;//动画的主体是TranslateTransform变形,而非Buttonthis.tt.BeginAnimation(TranslateTransform.XProperty, daX);this.tt.BeginAnimation(TranslateTransform.YProperty, daY);
}
3、DoubleAnimationUsingPath
使用 PathGeometry 在两个或多个目标值之间对 Double 属性值进行动画处理,以指定这些值。 此动画可用于沿路径移动可视对象。
//从XAML代码中获取移动路径数据
PathGeometry pg = this.LayoutRoot.FindResource("movingPath") as PathGeometry;
Duration duration = new Duration(TimeSpan.FromMilliseconds(600));//创建动画
DoubleAnimationUsingPath dapX = new DoubleAnimationUsingPath();
dapX.PathGeometry = pg;
dapX.Source = PathAnimationSource.X;
dapX.Duration = duration;DoubleAnimationUsingPath dapY = new DoubleAnimationUsingPath();
dapY.PathGeometry = pg;
dapY.Source = PathAnimationSource.Y;
dapY.Duration = duration;
//自动返回、永远循环
dapX.AutoReverse = true;
dapX.RepeatBehavior = RepeatBehavior.Forever;
dapY.AutoReverse = true;
dapY.RepeatBehavior = RepeatBehavior.Forever;//执行动画
this.tt.BeginAnimation(TranslateTransform.XProperty, dapX);
this.tt.BeginAnimation(TranslateTransform.YProperty, dapY);
4、DoubleAnimationUsingKeyFrames
根据一组 KeyFrames 对 Double 属性的值进行动画处理。
关键帧动画的目标值由其 KeyFrames 属性定义,该属性包含对象的集合 DoubleKeyFrame 。 每个都 DoubleKeyFrame 定义了动画的一段,其自己的目标和 ValueKeyTime。 当动画运行时,它会在指定的关键时间从一个键值前进到下一个键值。
有三种类型的 DoubleKeyFrame 类,每个支持的内插方法各有一种: LinearDoubleKeyFrame、 DiscreteDoubleKeyFrame和 SplineDoubleKeyFrame。
与 不同, DoubleAnimation可以 DoubleAnimationUsingKeyFrames 具有两个以上的目标值。 还可以控制单个 DoubleKeyFrame 段的内插方法。
DoubleAnimationUsingKeyFrames dakX = new DoubleAnimationUsingKeyFrames();
DoubleAnimationUsingKeyFrames dakY = new DoubleAnimationUsingKeyFrames();//设置动画总时长
dakX.Duration = new Duration(TimeSpan.FromMilliseconds(900));
dakY.Duration = new Duration(TimeSpan.FromMilliseconds(900));//创建、添加关键帧
LinearDoubleKeyFrame x_kf_1 = new LinearDoubleKeyFrame();
LinearDoubleKeyFrame x_kf_2 = new LinearDoubleKeyFrame();
LinearDoubleKeyFrame x_kf_3 = new LinearDoubleKeyFrame();x_kf_1.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(300));
x_kf_1.Value = 200;
x_kf_2.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(600));
x_kf_2.Value = 0;
x_kf_3.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(900));
x_kf_3.Value = 200;dakX.KeyFrames.Add(x_kf_1);
dakX.KeyFrames.Add(x_kf_2);
dakX.KeyFrames.Add(x_kf_3);LinearDoubleKeyFrame y_kf_1 = new LinearDoubleKeyFrame();
LinearDoubleKeyFrame y_kf_2 = new LinearDoubleKeyFrame();
LinearDoubleKeyFrame y_kf_3 = new LinearDoubleKeyFrame();y_kf_1.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(300));
y_kf_1.Value = 0;
y_kf_2.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(600));
y_kf_2.Value = 180;
y_kf_3.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(900));
y_kf_3.Value = 180;
dakY.KeyFrames.Add(y_kf_1);
dakY.KeyFrames.Add(y_kf_2);
dakY.KeyFrames.Add(y_kf_3);//执行动画
this.tt.BeginAnimation(TranslateTransform.XProperty, dakX);
this.tt.BeginAnimation(TranslateTransform.YProperty, dakY);
5、高级动画
AccelerationRation加速速率,介于0.0和0.1之间。
DecelerationRation减速速度,介于0.0和0.1之间。
SpeedRation动画实际播放速度与正常速度的比值。
AutoReverse是否以相反的动画方式从终止值返回起始值。
RepeatBehavior动画重复行为,取0为不播放,使用double类型值 可控制循环次数,取RepeatBehavior.Forver为永远循环。
EasingFunction缓冲式渐变。
6、场景动画
并行执行的一组动画。
以交互方式控制情节提要,可控制的情节提要可以暂停、恢复、查找、停止和删除。
数据绑定和对时间线进行动画处理。
后台代码方式实现
Duration duration = new Duration(TimeSpan.FromMilliseconds(600));//红色小球匀速移动
DoubleAnimation daRx = new DoubleAnimation();
daRx.Duration = duration;
daRx.To = 600;//绿色小球变速运动
DoubleAnimationUsingKeyFrames dakGx = new DoubleAnimationUsingKeyFrames();
dakGx.Duration = duration;
SplineDoubleKeyFrame kfG = new SplineDoubleKeyFrame(600, KeyTime.FromPercent(1.0));
kfG.KeySpline = new KeySpline(1, 0, 0, 1);
dakGx.KeyFrames.Add(kfG);//蓝色小球变速运行
DoubleAnimationUsingKeyFrames dakBx = new DoubleAnimationUsingKeyFrames();
dakBx.Duration = duration;
SplineDoubleKeyFrame kfB = new SplineDoubleKeyFrame(600, KeyTime.FromPercent(1.0));
kfB.KeySpline = new KeySpline(0, 1, 1, 0);
dakBx.KeyFrames.Add(kfB);//创建场景
Storyboard storyboard = new Storyboard();Storyboard.SetTargetName(daRx, "ttR");
Storyboard.SetTargetProperty(daRx, new PropertyPath(TranslateTransform.XProperty));Storyboard.SetTargetName(dakGx, "ttG");
Storyboard.SetTargetProperty(dakGx, new PropertyPath(TranslateTransform.XProperty));Storyboard.SetTargetName(dakBx, "ttB");
Storyboard.SetTargetProperty(dakBx, new PropertyPath(TranslateTransform.XProperty));storyboard.Duration = duration;
storyboard.Children.Add(daRx);
storyboard.Children.Add(dakGx);
storyboard.Children.Add(dakBx);storyboard.Begin(this);
storyboard.Completed += (a, b) => { MessageBox.Show(ttR.X.ToString()); };
前台XAML方式实现
<!--按钮--><Button Content="Go!" Grid.Column="1" Grid.RowSpan="3"><Button.Triggers><EventTrigger RoutedEvent="Button.Click"><BeginStoryboard><Storyboard Duration="0:0:0:6"><!--红色小球动画--><DoubleAnimation Storyboard.TargetProperty="X"Storyboard.TargetName="ttR"To="400"Duration="0:0:0:6" /><!--绿色小球动画--><DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="X"Storyboard.TargetName="ttG"Duration="0:0:0:6" ><SplineDoubleKeyFrame KeyTime="0:0:0:6" Value="400" KeySpline="1,0,0,1"/></DoubleAnimationUsingKeyFrames><!--蓝色小球动画--><DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="X"Storyboard.TargetName="ttB"Duration="0:0:0:6" ><SplineDoubleKeyFrame KeyTime="0:0:0:6" Value="400" KeySpline="0,1,1,0"/></DoubleAnimationUsingKeyFrames></Storyboard></BeginStoryboard></EventTrigger></Button.Triggers></Button>
相关文章:
WPF动画的使用
前言 弹幕是什么?这里是使用动画将控件弹起来,通过C#提供的多样化动画类型,我们可以制做出丰富的界面效果。主要有基于时间的动画和基于属性的动画。 1、Animatable 一个提供动画支持的抽象类。 继承 Object DispatcherObject Depende…...
跑腿代购app系统源码开发及功能分析
随着互联网技术的飞速发展和人们生活节奏的加快,跑腿代购服务作为一种便捷的生活方式,正逐渐渗透到我们日常生活的方方面面。从日常购物、餐饮外卖到文件传递、药品代购,跑腿服务以其高效、灵活的特点赢得了广大用户的青睐。而支撑这一服务高…...
mysql数据库:字符串函数
mysql数据库:字符串函数 mysql数据库:字符串函数 concat(str1,str2,…strn) 连接str1,str2,…,strn为一个字符串 select concat(abc,def)replace(str,a,b) 用字符串b替换str中所有出现的字符串a insert(str,x,y,instr…...
C语言实现游戏2048(超详细!!!超易懂!!!)
2048是众所周知的一款经典游戏,在曾经没有智能电脑和手机的年代,也陪伴了我们许多年。那今天就让我们用C语言来回顾一下这款游戏吧~ 一、游戏2048的思路 2048游戏的玩法是在初始的时候,给玩家一个4*4格子的,其中内容全为空的棋盘…...
MATLAB代码检查工具PolySpace
概述 PolySpace是MATLAB里面代码静态检查工具。通过检查源代码,可以确定可能在哪里发生潜在的运行时错误,例如算术溢出,缓冲区溢出等等。它最大的特点是可以检查车企常用的MISRA C标准,还免费,就让各大车企爱不释手。…...
FPGA设计之跨时钟域(CDC)设计篇(5)----同步FIFO的两种设计方法(计数器法/高位扩展法 | 手撕代码)
1、什么是FIFO? FIFO(First In First Out) 是一种先进先出的数据缓存器,在逻辑设计里面用的非常多。它是一种存储器结构,被广泛应用于芯片设计中。FIFO由存储单元队列或阵列构成,第一个被写入队列的数据也是第一个从队列中读出的数据。 FIFO 设计可以说是逻辑设计人员必须…...
快速掌握Vue:基础命令详解
1. Vue概述 Vue.js(读音 /vjuː/, 类似于 「view」) 是一套构建用户界面的 「渐进式框架」。与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计。Vue 的核心库只关注视图层,并且非常容易学习,非常容易与其它库…...
MySQL——索引(二)创建索引(1)创建表的时候创建索引
要想使用索引提高数据表的访问速度,首先要创建一个常引。创建索引的方式有三种,具体如下。 创建表的时候可以直接创建索引,这种方式最简单、方便,其基本的语法格式如下所示: CREATE TABLE 表名 (字段名 数据类型 [完整性约束条件…...
源代码加密怎么做?企业常用十款源代码加密软件排行榜
在数字化信息时代,源代码是企业的核心资产之一。保护源代码的安全不仅能防止知识产权泄露,还能保护企业的竞争优势。因此,源代码加密成为企业信息安全的重要环节。 源代码是软件的基础,包含了企业独特的技术和解决方案。未加密的源…...
python 文件打开、读、关闭练习
一、题目要求 二、代码实现 f open("D:\\workspace\\word.txt" , "r", encoding "UTF-8")# 方案一 # content f.read() # count content.count("itheima") # print(f"itmeiha在文件中出现了:{count}次")# 方案…...
迈向大规模小目标检测:综述与数据集
为了准确检测小目标,领域内现有方法大多基于通用目标检测范式进行针对性改进,根据这些改进所采用关键技术的不同,可以分为六种类别:(1)面向样本的方法;(2)基于尺度感知的…...
69、zabbix自动、代理、snmp监控
一、zabbix 1.1、自动发现 [roottest1 ~]# systemctl stop firewalld [roottest1 ~]# setenforce 0 [roottest3 ~]# vim /etc/hosts 192.168.168.21 test1 192.168.168.23 test3 [roottest1 ~]# vim /etc/hosts 192.168.168.21 test1 192.168.168.23 test3 ------------…...
搜索引擎设计:如何避免大海捞针般的信息搜索
搜索引擎设计:如何避免大海捞针般的信息搜索 随着互联网的发展,信息的数量呈爆炸式增长。如何在海量信息中快速、准确地找到所需信息,成为了搜索引擎设计中的核心问题。本文将详细探讨搜索引擎的设计原理和技术,从信息获取、索引…...
设计模式- 数据源架构模式
表数据入口(Table Data Gateway) 充当数据库表访问入口的对象。一个实例处理表中所有的行。 表数据入口包含了用于访问单个表或者视图的所有SQL,如选择、插入、更新、删除等。其他代码调用它的方法来实现所有与数据库的交互。 运行机制 表数据入口包括的每个方法…...
Unity 使用字符串更改Text指定文字颜色、大小、换行、透明
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、使用字符串改变文字属性的方法(一)修改颜色(二)修改大小(三)换行(四&…...
数字信号处理2: 离散信号与系统的频谱分析
文章目录 前言一、实验目的二、实验设备三、实验内容四、实验原理五、实验步骤1.序列的离散傅里叶变换及分析2.利用共轭对称性,设计高效算法计算2个N点实序列的DFT。3.线性卷积及循环卷积的实现及二者关系分析4.比较DFT和FFT的运算时间5.利用FFT求信号频谱及分析采样…...
20240805软考架构--------每日打卡题21-25
每日打卡题21-25答案 21、【2014年真题】 难度:一般 在UML提供的系统视图中, (1) 是逻辑视图的一次执行实例,描述了并发与同步结构; (2) 是最基本的需求分析模型。 (1&a…...
GPT-5:未来已来,你准备好了吗?
GPT-5 一年半后发布?对此你有何期待? IT之家6月22日消息,在美国达特茅斯工程学院周四公布的采访中,OpenAI首席技术官米拉穆拉蒂被问及GPT-5是否会在明年发布,给出了肯定答案并表示将在一年半后发布。此外,穆…...
解决C#对Firebase数据序列化失败的难题
背景介绍 在当今的游戏开发领域,Unity与Firebase的结合日益普及。Firebase实时数据库提供了强大的数据存储和同步功能,使开发者能够轻松管理和使用数据。然而,在使用C#进行Firebase数据序列化和反序列化时,常常会遇到一些棘手的问…...
设计模式中的类关系
1. 依赖(Dependency) 定义:一个类使用到另一个类的实例,通常是通过方法参数、局部变量等。依赖关系是最弱的关系,因为它仅仅表示类之间的临时关联。 特征:在 UML 图中,依赖关系用带箭头的虚线…...
一键迁移方案:OpenClaw配置备份与Qwen3-4B模型快速恢复
一键迁移方案:OpenClaw配置备份与Qwen3-4B模型快速恢复 1. 为什么需要配置迁移方案 上周我的开发机突然硬盘故障,导致所有OpenClaw配置丢失。重新配置飞书通道、模型连接和技能库花了大半天时间。这次教训让我意识到:自动化工具的配置本身也…...
网站页面加载速度对SEO有什么影响_什么是外链建设_外链对SEO有什么影响
网站页面加载速度对SEO有什么影响 在当今数字化时代,网站的加载速度已经成为影响搜索引擎优化(SEO)的一个关键因素。快速的页面加载速度不仅能够提升用户体验,还能够在搜索引擎中获得更高的排名。那么具体来说,网站页…...
如何选择适合你的Python Web服务器:uvicorn与gunicorn深度对比
1. 为什么需要关注Web服务器选择? 当你用Python开发完一个Web应用后,最后一步就是把它部署上线。这时候你会发现,直接运行python app.py这种方式根本撑不住几个用户访问。我刚开始做项目时就犯过这个错误,结果上线当天服务器就直接…...
基于智能软开关的配电网优化调度分析(含故障恢复能力与分布式电源影响)
基于智能软开关的配电网优化调度matlab 采用matlab编程,分析得到了含智能软开关下的配电网故障恢复能力,包括恢复负荷、失电节点以及节点电压等,程序选择标准ieee33节点系统作为分析对象,采用yalmip编程,运行稳定。 这…...
spring boot apm生态
一、spring boot actuatorSpring Boot Actuator Micrometer Prometheus Grafana组合1、spring boot actuator ,提供实时指标查询2、prometheus(美/ proˈmiθɪəs /),定期(比如每15秒)去调用应用的接口,把数据拉取…...
ADS7830 8位I²C模数转换器原理与Arduino/STM32跨平台驱动
1. 项目概述ADS7830 是德州仪器(Texas Instruments)推出的一款低功耗、8位精度、8通道逐次逼近型(SAR)模数转换器,专为嵌入式系统中对成本敏感、空间受限且需多路模拟信号采集的场景而设计。7Semi 公司基于该芯片开发的…...
Lansium-Arduino:面向物联网终端的轻量级MQTT通信库
1. 项目概述 Lansium-Arduino 是一个面向嵌入式物联网终端的轻量级通信库,专为 Arduino 生态(含 ESP32、ESP8266、Arduino Uno Ethernet/WiFi 扩展板等平台)设计,用于实现设备与 Lansium Server 的可靠双向连接。其核心通信协议…...
Bugtton:ATmega328P专用超低开销按钮消抖库
1. 项目概述Bugtton 是一款专为 ATmega328P 微控制器深度优化的轻量级按钮消抖库,其设计哲学直指嵌入式系统中一个被长期忽视却至关重要的性能瓶颈:空闲状态下的 CPU 周期开销。在传统 Arduino 风格的按钮处理方案中,digitalRead()函数因其通…...
【2026年最新600套毕设项目分享】基于Java的游泳馆管理系统(14337)
有需要的同学,源代码和配套文档领取,加文章最下方的名片哦 一、项目演示 项目演示视频 二、资料介绍 完整源代码(前后端源代码SQL脚本)配套文档(LWPPT开题报告/任务书)远程调试控屏包运行一键启动项目&…...
jEasyUI 显示海量数据
jEasyUI 显示海量数据 引言 随着互联网技术的飞速发展,大数据时代已经到来。在众多前端框架中,jEasyUI以其简洁、易用、功能强大等特点,受到了广大开发者的喜爱。本文将深入探讨jEasyUI在显示海量数据方面的应用,帮助开发者更好地应对大数据挑战。 jEasyUI简介 jEasyUI…...
