当前位置: 首页 > news >正文

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动画的使用

前言 弹幕是什么&#xff1f;这里是使用动画将控件弹起来&#xff0c;通过C#提供的多样化动画类型&#xff0c;我们可以制做出丰富的界面效果。主要有基于时间的动画和基于属性的动画。 1、Animatable 一个提供动画支持的抽象类。 继承 Object DispatcherObject Depende…...

跑腿代购app系统源码开发及功能分析

随着互联网技术的飞速发展和人们生活节奏的加快&#xff0c;跑腿代购服务作为一种便捷的生活方式&#xff0c;正逐渐渗透到我们日常生活的方方面面。从日常购物、餐饮外卖到文件传递、药品代购&#xff0c;跑腿服务以其高效、灵活的特点赢得了广大用户的青睐。而支撑这一服务高…...

mysql数据库:字符串函数

mysql数据库&#xff1a;字符串函数 mysql数据库&#xff1a;字符串函数 concat(str1,str2,…strn) 连接str1&#xff0c;str2&#xff0c;…&#xff0c;strn为一个字符串 select concat(abc,def)replace(str,a,b) 用字符串b替换str中所有出现的字符串a insert(str,x,y,instr…...

C语言实现游戏2048(超详细!!!超易懂!!!)

2048是众所周知的一款经典游戏&#xff0c;在曾经没有智能电脑和手机的年代&#xff0c;也陪伴了我们许多年。那今天就让我们用C语言来回顾一下这款游戏吧~ 一、游戏2048的思路 2048游戏的玩法是在初始的时候&#xff0c;给玩家一个4*4格子的&#xff0c;其中内容全为空的棋盘…...

MATLAB代码检查工具PolySpace

概述 PolySpace是MATLAB里面代码静态检查工具。通过检查源代码&#xff0c;可以确定可能在哪里发生潜在的运行时错误&#xff0c;例如算术溢出&#xff0c;缓冲区溢出等等。它最大的特点是可以检查车企常用的MISRA C标准&#xff0c;还免费&#xff0c;就让各大车企爱不释手。…...

FPGA设计之跨时钟域(CDC)设计篇(5)----同步FIFO的两种设计方法(计数器法/高位扩展法 | 手撕代码)

1、什么是FIFO? FIFO(First In First Out) 是一种先进先出的数据缓存器,在逻辑设计里面用的非常多。它是一种存储器结构,被广泛应用于芯片设计中。FIFO由存储单元队列或阵列构成,第一个被写入队列的数据也是第一个从队列中读出的数据。 FIFO 设计可以说是逻辑设计人员必须…...

快速掌握Vue:基础命令详解

1. Vue概述 Vue.js&#xff08;读音 /vjuː/, 类似于 「view」&#xff09; 是一套构建用户界面的 「渐进式框架」。与其他重量级框架不同的是&#xff0c;Vue 采用自底向上增量开发的设计。Vue 的核心库只关注视图层&#xff0c;并且非常容易学习&#xff0c;非常容易与其它库…...

MySQL——索引(二)创建索引(1)创建表的时候创建索引

要想使用索引提高数据表的访问速度&#xff0c;首先要创建一个常引。创建索引的方式有三种&#xff0c;具体如下。 创建表的时候可以直接创建索引&#xff0c;这种方式最简单、方便&#xff0c;其基本的语法格式如下所示: CREATE TABLE 表名 (字段名 数据类型 [完整性约束条件…...

源代码加密怎么做?企业常用十款源代码加密软件排行榜

在数字化信息时代&#xff0c;源代码是企业的核心资产之一。保护源代码的安全不仅能防止知识产权泄露&#xff0c;还能保护企业的竞争优势。因此&#xff0c;源代码加密成为企业信息安全的重要环节。 源代码是软件的基础&#xff0c;包含了企业独特的技术和解决方案。未加密的源…...

python 文件打开、读、关闭练习

一、题目要求 二、代码实现 f open("D:\\workspace\\word.txt" , "r", encoding "UTF-8")# 方案一 # content f.read() # count content.count("itheima") # print(f"itmeiha在文件中出现了&#xff1a;{count}次")# 方案…...

迈向大规模小目标检测:综述与数据集

为了准确检测小目标&#xff0c;领域内现有方法大多基于通用目标检测范式进行针对性改进&#xff0c;根据这些改进所采用关键技术的不同&#xff0c;可以分为六种类别&#xff1a;&#xff08;1&#xff09;面向样本的方法&#xff1b;&#xff08;2&#xff09;基于尺度感知的…...

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 ------------…...

搜索引擎设计:如何避免大海捞针般的信息搜索

搜索引擎设计&#xff1a;如何避免大海捞针般的信息搜索 随着互联网的发展&#xff0c;信息的数量呈爆炸式增长。如何在海量信息中快速、准确地找到所需信息&#xff0c;成为了搜索引擎设计中的核心问题。本文将详细探讨搜索引擎的设计原理和技术&#xff0c;从信息获取、索引…...

设计模式- 数据源架构模式

表数据入口(Table Data Gateway) 充当数据库表访问入口的对象。一个实例处理表中所有的行。 表数据入口包含了用于访问单个表或者视图的所有SQL&#xff0c;如选择、插入、更新、删除等。其他代码调用它的方法来实现所有与数据库的交互。 运行机制 表数据入口包括的每个方法…...

Unity 使用字符串更改Text指定文字颜色、大小、换行、透明

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、使用字符串改变文字属性的方法&#xff08;一&#xff09;修改颜色&#xff08;二&#xff09;修改大小&#xff08;三&#xff09;换行&#xff08;四&…...

数字信号处理2: 离散信号与系统的频谱分析

文章目录 前言一、实验目的二、实验设备三、实验内容四、实验原理五、实验步骤1.序列的离散傅里叶变换及分析2.利用共轭对称性&#xff0c;设计高效算法计算2个N点实序列的DFT。3.线性卷积及循环卷积的实现及二者关系分析4.比较DFT和FFT的运算时间5.利用FFT求信号频谱及分析采样…...

20240805软考架构--------每日打卡题21-25

每日打卡题21-25答案 21、【2014年真题】 难度&#xff1a;一般 在UML提供的系统视图中&#xff0c; &#xff08;1&#xff09; 是逻辑视图的一次执行实例&#xff0c;描述了并发与同步结构&#xff1b; &#xff08;2&#xff09; 是最基本的需求分析模型。 &#xff08;1&a…...

GPT-5:未来已来,你准备好了吗?

GPT-5 一年半后发布&#xff1f;对此你有何期待&#xff1f; IT之家6月22日消息&#xff0c;在美国达特茅斯工程学院周四公布的采访中&#xff0c;OpenAI首席技术官米拉穆拉蒂被问及GPT-5是否会在明年发布&#xff0c;给出了肯定答案并表示将在一年半后发布。此外&#xff0c;穆…...

解决C#对Firebase数据序列化失败的难题

背景介绍 在当今的游戏开发领域&#xff0c;Unity与Firebase的结合日益普及。Firebase实时数据库提供了强大的数据存储和同步功能&#xff0c;使开发者能够轻松管理和使用数据。然而&#xff0c;在使用C#进行Firebase数据序列化和反序列化时&#xff0c;常常会遇到一些棘手的问…...

设计模式中的类关系

1. 依赖&#xff08;Dependency&#xff09; 定义&#xff1a;一个类使用到另一个类的实例&#xff0c;通常是通过方法参数、局部变量等。依赖关系是最弱的关系&#xff0c;因为它仅仅表示类之间的临时关联。 特征&#xff1a;在 UML 图中&#xff0c;依赖关系用带箭头的虚线…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

三分算法与DeepSeek辅助证明是单峰函数

前置 单峰函数有唯一的最大值&#xff0c;最大值左侧的数值严格单调递增&#xff0c;最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值&#xff0c;最小值左侧的数值严格单调递减&#xff0c;最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...

若依登录用户名和密码加密

/*** 获取公钥&#xff1a;前端用来密码加密* return*/GetMapping("/getPublicKey")public RSAUtil.RSAKeyPair getPublicKey() {return RSAUtil.rsaKeyPair();}新建RSAUti.Java package com.ruoyi.common.utils;import org.apache.commons.codec.binary.Base64; im…...

2.3 物理层设备

在这个视频中&#xff0c;我们要学习工作在物理层的两种网络设备&#xff0c;分别是中继器和集线器。首先来看中继器。在计算机网络中两个节点之间&#xff0c;需要通过物理传输媒体或者说物理传输介质进行连接。像同轴电缆、双绞线就是典型的传输介质&#xff0c;假设A节点要给…...

Spring AOP代理对象生成原理

代理对象生成的关键类是【AnnotationAwareAspectJAutoProxyCreator】&#xff0c;这个类继承了【BeanPostProcessor】是一个后置处理器 在bean对象生命周期中初始化时执行【org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization】方法时…...

精益数据分析(98/126):电商转化率优化与网站性能的底层逻辑

精益数据分析&#xff08;98/126&#xff09;&#xff1a;电商转化率优化与网站性能的底层逻辑 在电子商务领域&#xff0c;转化率与网站性能是决定商业成败的核心指标。今天&#xff0c;我们将深入解析不同类型电商平台的转化率基准&#xff0c;探讨页面加载速度对用户行为的…...

HTML中各种标签的作用

一、HTML文件主要标签结构及说明 1. <&#xff01;DOCTYPE html> 作用&#xff1a;声明文档类型&#xff0c;告知浏览器这是 HTML5 文档。 必须&#xff1a;是。 2. <html lang“zh”>. </html> 作用&#xff1a;包裹整个网页内容&#xff0c;lang"z…...

Excel 怎么让透视表以正常Excel表格形式显示

目录 1、创建数据透视表 2、设计 》报表布局 》以表格形式显示 3、设计 》分类汇总 》不显示分类汇总 1、创建数据透视表 2、设计 》报表布局 》以表格形式显示 3、设计 》分类汇总 》不显示分类汇总...