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;分页查询 分页查询可以有效控制一次查询出来的结果集的…

AutoSar AP CM原始数据流传输接口总结

一、原始数据流传输接口概述 自适应 AUTOSAR 通信管理通常基于面向服务的通信&#xff0c;但对于高级驾驶辅助系统&#xff08;ADAS&#xff09;应用&#xff0c;高效传输原始二进制数据流很重要&#xff0c;原始数据二进制流 API 为此提供了解决方案。它能与车辆外部传感器高…

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

TiDB 关联子查询及半连接的优化实践

作者&#xff1a; 数据源的TiDB学习之路 原文来源&#xff1a; https://tidb.net/blog/e9563a23 导读 TiDB 针对子查询语句会执行多种 子查询相关的优化 &#xff0c;以提升子查询的执行性能。半连接语句和关联子查询语句是常用的两类子查询&#xff0c;TiDB 优化器默认包…

《浙江工业大学学报》

《浙江工业大学学报》 国际标准刊号&#xff1a;ISSN 1006-4303&#xff0c;国内统一刊号&#xff1a;CN 33-1193/T。 本刊主要报道本校各学科最新的研究成果&#xff0c;并择优刊登相关学科的外稿。覆盖的学科主要有化学工程、机械工程、信息工程、建筑工程以及生物与环境工…

图像中的数值计算

目录 图像读取与形状图像数据展示图像数据操作超出范围的像素值处理 图像读取与形状 使用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"…

Bean的实例化方式

1. 通过构造方法实例化&#xff08;Constructor Instantiation&#xff09; 这是最常见的方式&#xff0c;Spring通过调用类的构造方法来创建Bean实例。 XML配置示例 <bean id"userDao" class"com.example.UserDao" />Spring容器在加载时调用User…

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

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

C++中的vector使用与实现

一、vector的使用 1.1 vector的定义 是一种类模板 template < class T, class Alloc allocator<T> > class vector; 其中的模板参数Alloc是在使用空间配置器&#xff08;内存池&#xff09;&#xff0c;并给了缺省值&#xff0c;暂时不深究 1.2遍历方式 1.…

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操作指南&#…

STM32端与C#端的连接与交互[外设][代码记录]

1. 通过UART串口进行通信 STM32 端代码&#xff08;UART通信&#xff09;&#xff1a; #include "stm32f1xx_hal.h"UART_HandleTypeDef huart1;void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_USART1_UART_Init(void);int main(v…

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

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

QT程序报错解决方案:Cannot queue arguments of type ‘QTextCharFormat‘ 或 ‘QTextCursor‘

项目场景&#xff1a; 项目场景&#xff1a;基于QT实现的C某程序&#xff0c;搭载在Linux环境中。 问题描述 执行程序时&#xff0c;发现log中报错如下内容&#xff1a; QObject::connect: Cannot queue arguments of type QTextCharFormat (Make sure QTextCharFormat is r…

Cesium for UE-04-一些说明

目前主要做webgis的工作&#xff0c;UE官方对web的支持截止到了4.23版本&#xff0c;即使是4.23版本之后的4.xx版本也有办法支持&#xff0c;已经有大佬开源了一些方法和工具&#xff0c;不再介绍。即使是4.23想要输出为h5&#xff0c;也是有一定的折腾门槛的。最重要的是【Ces…