Electron-(二)桌面应用的启动动画创建

一、概述

在很多桌面应用中都会有启动画面的显示。启动画面可以解决在启动时耗时较长,将每一步反馈给用户。另外一方面解决启动过程中的环境检查及检查结果的反馈。

在当今的桌面应用领域,启动动画已成为提升用户体验的重要组成部分。它不仅仅是一个简单的视觉效果,更是一种与用户沟通的方式。在很多桌面应用中,启动画面的显示具有至关重要的作用。一方面,当应用在启动时可能会因为各种复杂的初始化过程而耗时较长,启动动画能够将这个过程分段展示给用户,让用户了解应用正在进行的操作以及大致的进度。另一方面,它还能够在启动过程中对环境进行检查,并及时将检查结果反馈给用户,使用户对应用的启动状态有更清晰的了解。

二、主要思路

通过启动动画,将加载过程分段化,在步骤中进行环境检查。

通过精心设计的启动动画,我们可以将应用的加载过程进行合理的分段化处理。在每一个分段步骤中,不仅可以展示加载的进度,还能够对相关的环境条件进行检查。这种将加载过程与环境检查相结合的方式,使得应用在启动过程中能够更加智能地与用户交互,及时发现并处理可能出现的问题,确保应用能够顺利启动。

三、实现步骤

1. 定义启动步骤

这是创建启动动画的基础。每一个启动步骤都包含了丰富的信息,这些信息共同构成了动画展示的核心内容。

  • 进度百分比(progress):它清晰地向用户展示了当前步骤在整个启动过程中所处的位置,让用户能够直观地了解到应用的加载进度。例如,一个步骤的进度百分比为 0.1,表示该步骤在整个启动过程中大约完成了 10%。
  • 停留时间(time):每个步骤都需要一定的时间来完成相应的操作,这个停留时间就是为了确保步骤能够充分执行。比如,设置为 1000 毫秒,意味着在这个步骤上,应用会停留 1 秒左右来完成相关任务。
  • 标题(title):标题是对每个步骤主要内容的概括,能够让用户快速了解当前步骤的大致目的。例如,“初始化” 这个标题就表明该步骤可能是在对应用的一些基本设置或组件进行初始化操作。
  • 内容(content):它进一步详细描述了步骤所涉及的具体操作或相关信息。虽然在某些简单的步骤中可能内容为空,但在一些复杂的步骤中,内容可以详细说明正在进行的操作细节。
  • 完成时的信息(finishInfo):包括了步骤完成时可能出现的两种结果,即成果和失败的相关信息。这对于用户了解步骤的最终状态非常重要。例如,一个步骤可能在完成时显示 “完成” 或 “失败” 的提示信息。
  • 失败时候是否停止(stopWhenFailure):这个属性决定了当步骤出现失败情况时,整个启动过程是否应该停止。如果设置为false,则即使该步骤失败,应用仍会尝试继续后续的步骤;如果设置为true,则一旦该步骤失败,整个启动过程将停止。
  • 具体执行步骤(action):这是每个步骤的核心操作部分,它定义了该步骤具体要做什么事情。通常是一个异步操作,并且需要返回True或False来表示操作是否成功。例如,一个步骤可能通过setTimeout来模拟一个异步操作,并在一定时间后通过回调函数返回True表示操作成功。

示例:

const step = {progress: 0.1,time: 1000,title: "初始化",content: "",finishInfo: ["完成", "失败"],stopWhenFailure: false,action: (callback) => {setTimeout(() => {callback(true);}, 500);},}
2. 依次实现启动步骤

由于每一步的步骤可能是异步操作,隐藏采用递归方法实现在每一步执行完成后再进行下一步骤。

递归执行的核心逻辑(runStep函数)

  1. 首先,通过const step = steps[i];获取当前要执行的步骤。如果当前步骤不存在(!step),则表示所有步骤已经执行完毕,函数直接返回。在每个步骤开始时,通过 log.info(正在进行启动第x步,{step.title} ${step.content});记录日志,让开发者能够清楚地了解到应用正在执行的步骤内容。

  2. 然后,通过const info = getStepStartInfo(steps, step,i);获取步骤开始时的相关信息,并通过loadingWin.webContents.send(MESSAGE_TYPES.LOADING_STEP_INFO,info);将这些信息发送到加载窗口,以便在窗口中显示相关的启动步骤信息。

  3. 接着,定义了stepEnd函数来处理步骤结束时的情况。如果步骤失败(!res&&step.stopWhenFailure),则通过whenStepFailure(loadingWin, mainWindow, step, i,theInfo);处理失败情况;如果步骤成功,则通过const info = getStepEndInfo(step, i, res);获取步骤结束时的信息,并通过loadingWin.webContents.send(MESSAGE_TYPES.LOADING_STEP_INFO, info);将信息发送到加载窗口显示。

  4. 在步骤成功后,通过sleep(step.time||1000);保持等待画面,显示进度,这里的sleep函数可能是一个自定义的用于模拟等待时间的函数。当所有步骤都执行完成(i===steps.length-5)时,通过startMainWindow(mainWindow, loadingWin);启动主窗口,并关闭加载窗口。

  5. 最后,如果当前步骤不是最后一个步骤(i < steps.length),则通过runStep(i + 1);递归调用自身,继续执行下一个步骤。

// 递归执行启动步骤
const runStep = (i) => {const step = steps[i];if (!step) return;// step 开始log.info(`正在进行启动第${i + 1}步,${step.title} ${step.content}`);const info = getStepStartInfo(steps, step, i);loadingWin.webContents.send(MESSAGE_TYPES.LOADING_STEP_INFO, info);const stepEnd = (res) => {// step 失败if (!res && step.stopWhenFailure) {whenStepFailure(loadingWin, mainWindow, step, i, theInfo);return;}// step 成功const info = getStepEndInfo(step, i, res);loadingWin.webContents.send(MESSAGE_TYPES.LOADING_STEP_INFO, info);// 保持等待画面,显示进度sleep(step.time || 1000);// 所有 step 都执行完成i === steps.length - 1 && startMainWindow(mainWindow, loadingWin);// 下一个 stepi < steps.length && runStep(i + 1);};const theInfo = info;step.action(stepEnd);
};
runStep(0);

四、实现效果

通过上述的实现步骤,我们可以创建出一个具有良好用户体验的启动动画。

在实际应用中,用户可以看到一个清晰的加载窗口,窗口中依次展示各个启动步骤的信息,包括进度百分比、标题、内容以及完成时的信息等。

用户能够直观地了解到应用的启动进度和状态,

同时,应用也能够在启动过程中对环境进行检查,并及时处理可能出现的问题,确保应用能够顺利启动。

动画窗口

五、其他内容

请参考本博客相关内容。

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

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

相关文章

【Linux】main函数的参数列表从何而来?

Linux系统进程通过exec系列函数启动新程序时&#xff0c;argc整型 、 argv数组 和 环境变量表 environ 会作为 exec 系列函数的参数&#xff0c;显式传递给新程序的 main 函数。 main函数的参数列表 在C语言中&#xff0c;main函数的标准参数列表通常如下所示&#xff1a; in…

极客wordpress模板

这是一个展示WordPress主题的网页设计。页面顶部有一个导航栏&#xff0c;包含多个选项&#xff0c;如“关于我们”、“产品中心”、“案例展示”、“新闻动态”、“联系我们”和“技术支持”。页面中间部分展示了多个产品&#xff0c;每个产品都有一个图片和简短的描述。页面下…

MySQL【知识改变命运】06

前言&#xff1a;在05这节数据结构里面&#xff0c;我们知道select * from 这个操作很危险&#xff0c;如果数据库很大&#xff0c;会把服务器资源耗尽&#xff0c;接下来提到的查询可以有效的限制返回记录 1&#xff1a;分页查询 分页查询可以有效控制一次查询出来的结果集的…

【CTF刷题9】2024.10.19

[MoeCTF 2021]babyRCE 考点&#xff1a;关键词过滤&#xff08;绕过方法参考往期博客&#xff09; 来源&#xff1a;nssctf <?php$rce $_GET[rce]; if (isset($rce)) {if (!preg_match("/cat|more|less|head|tac|tail|nl|od|vi|vim|sort|flag| |\;|[0-9]|\*|\|\%|\&g…

图像中的数值计算

目录 图像读取与形状图像数据展示图像数据操作超出范围的像素值处理 图像读取与形状 使用cv2.imread函数读取图像文件。图像的形状通过shape属性获取&#xff0c;格式为(高度, 宽度, 颜色通道数)。 import cv2img1 cv2.imread(bg.jpg) img2 cv2.imread(fish.jpg)print(img1…

Linux服务器安装SRAToolkit教程

SRAToolkit是由NCBI&#xff08;美国国家生物技术信息中心&#xff09;提供的一个工具集&#xff0c;用于下载、读取和转换SRA&#xff08;Sequence Read Archive&#xff09;格式的数据文件。这些数据文件包含了大规模的核酸序列数据&#xff0c;对于基因组学研究至关重要。本…

pytorch激活函数介绍

在 PyTorch 中,激活函数(Activation Functions)是神经网络中重要的非线性组件,用于引入非线性,使网络能够学习复杂的函数关系。以下是 PyTorch 中常见的激活函数及其特点: 1. ReLU (Rectified Linear Unit) 函数: torch.nn.ReLU()公式: ReLU(x)=max⁡(0,x)特点: 常用于隐…

python-代码技巧

python-代码技巧 简单tips1、多个列表循环遍历2、使用map对列表中多个文件进行批量操作 仅个人笔记使用&#xff0c;感谢点赞关注 简单tips 1、多个列表循环遍历 dataTypes ["train","test"] dataStations ["1","2","3"…

【C语言】自定义类型:结构体--结构体内存对齐(用于计算结构体的大小)

结构体内存对齐 结构体内存对齐用于计算结构体的大小。 &#xff08;1&#xff09;对齐规则 1&#xff09;&#xff09;结构体的第一个成员对齐到和结构体变量起始位置偏移量为0的地址处。 2&#xff09;&#xff09;其他成员变量要对齐到某个数字&#xff08;对齐数&#…

FFmpeg 4.3 音视频-多路H265监控录放C++开发四 :RGB颜色

一 RGB 的意义&#xff1f; 为什么要从RGB 开始讲起呢&#xff1f; 因为最终传输到显卡显示器的颜色都是RGB 即使能处理YUV的API&#xff0c;本质上也是帮你做了从 YUV 到 RGB的转换。 RGB888 表示 R 占8bit&#xff0c;G 占8bit&#xff0c;B 占8bit&#xff0c;也就是每一…

Gin框架操作指南10:服务器与高级功能

官方文档地址&#xff08;中文&#xff09;&#xff1a;https://gin-gonic.com/zh-cn/docs/ 注&#xff1a;本教程采用工作区机制&#xff0c;所以一个项目下载了Gin框架&#xff0c;其余项目就无需重复下载&#xff0c;想了解的读者可阅读第一节&#xff1a;Gin操作指南&#…

手撕布隆过滤器:原理解析与面试心得

前言 说来话长&#xff0c;话来说长。前些天我投了一些日常实习的简历&#xff0c;结果足足等了两个礼拜才收到面试通知&#xff0c;看来如今的行情确实是挺紧张的。当时我是满怀信心去的&#xff0c;心想这次一定要好好拷打面试官一番&#xff0c;结果没想到&#xff0c;自我…

腰背肌筋膜炎有哪些治疗方法

腰背肌筋膜炎主要表现为腰背部的疼痛、酸胀、僵硬、活动受限等症状。在疾病初期&#xff0c;症状可能相对较轻&#xff0c;通过休息、保暖、适当的物理治疗等&#xff0c;往往可以缓解症状&#xff0c;此时病情不算严重。如果患者不重视&#xff0c;继续保持不良的生活习惯&…

微服务架构 --- 使用RabbitMQ进行异步处理

目录 一.什么是RabbitMQ&#xff1f; 二.异步调用处理逻辑&#xff1a; 三.RabbitMQ的基本使用&#xff1a; 1.安装&#xff1a; 2.架构图&#xff1a; 3.RabbitMQ控制台的使用&#xff1a; &#xff08;1&#xff09;Exchanges 交换机&#xff1a; &#xff08;2&#…

什么是不同类型的微服务测试?

大家好&#xff0c;我是锋哥。今天分享关于【什么是不同类型的微服务测试&#xff1f;】面试题&#xff1f;希望对大家有帮助&#xff1b; 什么是不同类型的微服务测试&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 微服务架构中的测试可以分为多种类…

WPF基础权限系统

一.开发环境 VisualStudio 2022NET SDK 8.0Prism 版本 8.1.97Sqlite 二. 功能介绍 WPF 基础权限系统&#xff0c;是一个支持前后端分离设计的 客户端(C/S)项目&#xff0c;该示例项目前端xaml使用UI库 &#xff0c;Material Design Themes UI 来构建用户界面&#xff0c;确保…

【into outfile写文件】

简介 select * from user into outfile C:/Users/ichunqiu/Desktop/PhpStudy2018/PHPTutorial/WWW/1.txt;用法的意思就是把user表中查询到的所有字段都导出到1.txt文件中 我们之前还有学到dumpfile&#xff0c;单是它只能导出一条数据 写入shell 测试注入点 usernameadmin&…

【工具】使用perf抓取火焰图

背景 当程序存在cpu性能问题时&#xff0c;我们需要找到是哪个函数占用较多的CPU&#xff0c;也就是找出热点函数&#xff1b;perf的火焰图就是这个用途 安装 在Linux系统中&#xff0c;perf 是 Linux 内核提供的性能分析工具&#xff0c;它通常包含在内核源代码包中。大多数…

编码方式知识整理【ASCII、Unicode和UTF-8】

编码方式 一、ASCII编码二、Unicode 编码三、UTF-8编码四、GB2312编码五、GBK编码 计算机中对数据的存储为二进制形式&#xff0c;但采用什么样的编码方式存储&#xff0c;效率更高。主要编码方式有 ASCII、Unicode、UTF-8等。 英文一般为1个字节&#xff0c;汉字一般为3个字节…

Linux 线程互斥

1.相关背景概念 临界资源&#xff1a;多线程执行流共享的资源就叫做临界资源 临界区&#xff1a;每个线程内部&#xff0c;访问临界资源的代码&#xff0c;就叫做临界区 #include <iostream> #include <pthread.h> #include <string> #include <vector…