WPF 实现一个吃豆豆的Loading加载动画

news/2024/9/20 7:24:51/文章来源:https://www.cnblogs.com/lvpp13/p/18412070

运行的效果如下

 

先引入一下我们需要的库

在nuget上面搜一下"expression.Drawing",安装一下这个包

 

我们再创建一个Window,引入一下这个包的命名空间

我们设置一下这个加载动画呈现的窗体的样式

        xmlns:ed="http://schemas.microsoft.com/expression/2010/drawing"mc:Ignorable="d"WindowStyle="None"ResizeMode="NoResize"Background="#4C858585"WindowStartupLocation="CenterScreen"AllowsTransparency="True"Loaded="Window_Loaded"Title="Window1" Height="400" Width="400"

然后我们要用到我们添加的库里面的一个圆弧控件

        <ed:Arc x:Name="arc" Height="100" Width="100" StrokeThickness="50" Panel.ZIndex="1"StartAngle="-240" EndAngle="-300" Stretch="None"ArcThicknessUnit="Pixel"><ed:Arc.Stroke><RadialGradientBrush GradientOrigin="0.3,0.3" RadiusX="0.7" RadiusY="0.7"><GradientStop Color="#FFFFF00E" Offset="1"/><GradientStop Color="White" Offset="0"/></RadialGradientBrush></ed:Arc.Stroke></ed:Arc>

背景色设置成一个圆形渐变的原因是为了让这个控件看起来像一个球体,而不是一个圆,得到的效果如下:

再到下面放几个圆球

<StackPanel Orientation="Horizontal" VerticalAlignment="Center" HorizontalAlignment="Center" Width="200" Margin="200,0,0,0"><StackPanel x:Name="stackPanel" Orientation="Horizontal" RenderTransformOrigin="0.5,0.5">
    <!--这里是为了后面的动画用,因为我是用blend添加的动画,所以生成的代码如下--><StackPanel.RenderTransform><TransformGroup><ScaleTransform/><SkewTransform/><RotateTransform/><TranslateTransform/></TransformGroup></StackPanel.RenderTransform><Ellipse/><Ellipse Margin="20,0"/><Ellipse /><Ellipse Margin="20,0"/><Ellipse /><Ellipse Margin="20,0"/></StackPanel> </StackPanel>

资源里面添加一下这些球的大小和颜色

        <Style TargetType="{x:Type Ellipse}"><Setter Property="Height" Value="20"/><Setter Property="Width" Value="20"/><Setter Property="Fill" Value="#FFFF5800"/></Style>

就会得到下面这个样子

我们再添加一下动画,让这两部分动起来

        <Storyboard x:Key="Storyboard1" RepeatBehavior="Forever" AutoReverse="True"><DoubleAnimationUsingKeyFrames Storyboard.TargetName="arc" Storyboard.TargetProperty="(ed:Arc.EndAngle)"><EasingDoubleKeyFrame KeyTime="00:00:00" Value="-300"/><EasingDoubleKeyFrame KeyTime="00:00:0.25" Value="-271"/></DoubleAnimationUsingKeyFrames><DoubleAnimationUsingKeyFrames Storyboard.TargetName="arc" Storyboard.TargetProperty="(ed:Arc.StartAngle)"><EasingDoubleKeyFrame KeyTime="00:00:00" Value="-240"/><EasingDoubleKeyFrame KeyTime="00:00:0.25" Value="-270"/></DoubleAnimationUsingKeyFrames></Storyboard><Storyboard x:Key="Storyboard2" RepeatBehavior="Forever"><DoubleAnimationUsingKeyFrames Storyboard.TargetName="stackPanel" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)"><EasingDoubleKeyFrame KeyTime="00:00:00" Value="0"/><EasingDoubleKeyFrame KeyTime="00:00:01" Value="-78"/></DoubleAnimationUsingKeyFrames></Storyboard>

还需要把这个动画也动起来,在window的loaded事件里面添加下面的代码

        private void Window_Loaded(object sender, RoutedEventArgs e){var b = FindResource("Storyboard1") as Storyboard;b.Begin();var c = FindResource("Storyboard2") as Storyboard;c.Begin();}

这个时候运行这个窗体,就会发现已经实现了吃豆豆的效果,但是因为动画是一直在循环,小豆子一直往左边移动的时候,移动到一个位置就不会移动了,动画在重置的时候会让

动画看起来有一个延迟感,我们可以给这豆子的父级添加一个clip,让动画视觉上看起来是连续的(这里可以对比一下添加clip和不添加的效果的区别)

<StackPanel Orientation="Horizontal" VerticalAlignment="Center" HorizontalAlignment="Center" Width="200" Margin="200,0,0,0">
    <StackPanel.Clip><RectangleGeometry><RectangleGeometry.Rect><Rect X="0" Y="0" Width="150" Height="40"/></RectangleGeometry.Rect></RectangleGeometry></StackPanel.Clip><StackPanel x:Name="stackPanel" Orientation="Horizontal" RenderTransformOrigin="0.5,0.5"><!--这里是为了后面的动画用,因为我是用blend添加的动画,所以生成的代码如下--><StackPanel.RenderTransform><TransformGroup><ScaleTransform/><SkewTransform/><RotateTransform/><TranslateTransform/></TransformGroup></StackPanel.RenderTransform><Ellipse/><Ellipse Margin="20,0"/><Ellipse /><Ellipse Margin="20,0"/><Ellipse /><Ellipse Margin="20,0"/></StackPanel>
</StackPanel>

然后就是怎么把这个效果运用到我们的项目中

我们再添加一个window2,在里面添加一个button

button的click事件代码如下

我们运行window2,点击一下按钮,就会发现3秒钟以后,吃豆豆的动画就消失了,也就是数据加载完成,吃豆豆就不显示了

如果项目里面有很多的地方都要用到这个动画,我们可以添加一个类来专门做这个动画的事情

代码里面的Action就是我们需要耗时的一些操作

所以我们的button的click里面的代码就变成了下面这段代码

好了,到这里这个动画的实现就结束了

 

项目github地址:bearhanQ/WPFFramework: Share some experience (github.com)

QQ技术交流群:332035933;

 

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

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

相关文章

[EGOI2024] Infinite Race题解

[EGOI2024] Infinite Race 妙妙题。 我们设 \(cnt[x]\) 表示当Anika和第 \(x\) 位选手相遇时Anika至少几次经过终点线。 设定初始状态 \(cnt[x]=-1\) 表示两种等价的情况:Anika还未和第 \(x\) 位选手相遇过 Anika被第 \(x\) 位选手超越了因此只剩下Anika超越了第 \(x\) 位选手…

仁科环境监控平台 温湿度采集 报错

應用程式: Monitor.exe Framework 版本: v4.0.30319 描述: 處理序已終止,因為有未處理的例外狀況。例外狀況資訊: System.AccessViolationException 於 Gecko.SpiderMonkey.JS_ExecuteScript_Win32(IntPtr, IntPtr ByRef, Gecko.MutableHandleValue ByRef) 於 Gecko.SpiderMon…

2024 ICPC复习 20-30页

https://www.luogu.com.cn/problem/CF1703G首先这个题一定要意识到 他是一个折半的操作 1e9最多被操作30次 所以我么完全dp第二维可以放这个次数 然后 dp数组就开出来了 时间复杂度也就明确了 对于某一个箱子 可以使用好钥匙打开也可以不用 用坏钥匙 好钥匙打开就是 dp i j=dp…

3、静态链表

1、静态链表初始化 head指向-1代表当前为空链表,pool指向下一个可用空间(在数组下标为2的空间),2指向3,3指向4,最后的指向0表示没有下一个节点,以此链接起来。2、实现代码#include<stdio.h> #include<malloc.h>#define MAX_SIZE 20typedef char ElemType;type…

终极 Nginx 配置指南

转自:https://www.toutiao.com/article/7412444010868687412/?app=news_article_lite&timestamp=1726183629&use_new_style=1&req_id=20240913072708897999327556746BD261&group_id=7412444010868687412&share_token=d101eb4b-9c8a-45a3-82f8-a9020419cc3…

MBR30200PT-ASEMI开关电源专用MBR30200PT

MBR30200PT-ASEMI开关电源专用MBR30200PT编辑:ll MBR30200PT-ASEMI开关电源专用MBR30200PT 型号:MBR30200PT 品牌:ASEMI 封装:TO-247 安装方式:插件 批号:最新 最大平均正向电流(IF):30A 最大循环峰值反向电压(VRRM):200V 最大正向电压(VF):0.70V~0..90V 工作温…

docker配置springcloud项目到服务器

1.服务器安装部署docker镜像 2.创建镜像目录,如图所示 以其中一个服务为例,每个文件夹对应一个服务单元,每个文件夹中包含 sh,Dockerfile文件 3.编辑项目中的application-test(根据环境来定),如图: 4.配置Nacos,单独配置命名空间,增加配置文件,注意,组一定要是test,…

学习笔记 - 知识图谱的符号表示方法

学习笔记 - 知识图谱的符号表示方法 说明:首次发表日期:2024-09-13 个人阅读学习并摘录成笔记知识表示的相关名词定义以下内容摘录自 Knowledge Graphs Applied 2.3小节,然后AI翻译+人工润色。实体(Entities)---表示知识的核心概念,其他所有东西都是围绕其构建的。实体可…

[NLP/AIGC/GPT] RAG : 检索增强型生成技术,智能体的外挂知识库

1 概述 : RAG RAG 技术的概念、起源 大家每天都会看到各种 RAG 框架、论文和开源项目,也都知道 RAG (Retrieval-Augmented Generation) 是检索增强型生成。 但大家还记得 RAG 这个概念源自哪里吗? RAG 概念来自 Facebook AI Research在 2020 年的一篇论文:《** Retrieval-Au…

调研记录

最近做了一批调研,记录照片如下。

ArgoWorkflow教程(四)---Workflow 日志归档

上一篇我们分析了argo-workflow 中的 artifact,包括 artifact-repository 配置以及 Workflow 中如何使用 artifact。本篇主要分析流水线 GC 以及归档,防止无限占用集群中 etcd 的空间。1. 概述 因为 ArgoWorkflow 是用 CRD 方式实现的,不需要外部存储服务也可以正常运行:运行…