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

news2024/11/29 3:58:57

一、概述

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

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

二、主要思路

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

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

三、实现步骤

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);

    // 下一个 step
    i < steps.length && runStep(i + 1);
  };
  const theInfo = info;
  step.action(stepEnd);
};
runStep(0);

四、实现效果

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

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

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

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

动画窗口

五、其他内容

请参考本博客相关内容。

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

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

相关文章

使用 Spring 框架构建 MVC 应用程序:初学者教程

Spring Framework 是一个功能强大、功能丰富且设计精良的 Java 平台框架。它提供了一系列编程和配置模型&#xff0c;旨在简化和精简 Java 中健壮且可测试的应用程序的开发过程。 人们常说 Java 太复杂了&#xff0c;构建简单的应用程序需要很长时间。尽管如此&#xff0c;Jav…

Leetcode——数组:滑动窗口209.长度最小的子数组

题目 题解 当需要查找数组中某些连续的数字之和&#xff0c;适合使用滑动窗口 先将滑动窗口的长度设置为0&#xff0c;先将左侧固定&#xff0c;右边界向右移动&#xff0c;同时计算需要找的条件&#xff0c;直到找到可行解为止 当找到可行解后&#xff0c;对其进行优化&…

BUU刷题-Pwn-jarvisoj_typo(ARM符号表恢复技术,Rizzo,FLIRT)

解题所涉知识点&#xff1a; 泄露或修改内存数据&#xff1a; 堆地址&#xff1a;栈地址&#xff1a;libc地址&#xff1a;BSS段地址&#xff1a; 劫持程序执行流程&#xff1a;ARM_ROP 获得shell或flag&#xff1a;调用程序中的system 题目类型&#xff1a; ARM_Pwn arm32 …

Android Framework AMS(04)startActivity分析-1(am启动到ActivityThread启动)

该系列文章总纲链接&#xff1a;专题总纲目录 Android Framework 总纲 本章关键点总结 & 说明&#xff1a; 说明&#xff1a;本章节主要解读AMS通过startActivity启动Activity的整个流程的第一阶段&#xff1a;从am启动到ActivityThread启动。 第二阶段文章链接为&#xf…

如何破解 AI 聊天机器人让它们吐露秘密!窥探 AI 系统指令的 10 种技巧

​ 有时&#xff0c;为了确保 AI 的安全性和透明性&#xff0c;用户需要自己动手&#xff0c;揭开系统指令的面纱。 如果人工智能现在已经成为生活中的事实&#xff0c;并影响着我们的福祉&#xff0c;人们理应知道它的运作原理。 对一些人来说&#xff0c;科幻电影中的经典…

【C++进阶】封装红黑树实现map和set

【C进阶】封装红黑树实现map和set &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;C&#x1f96d; &#x1f33c;文章目录&#x1f33c; 1. 源码及框架分析 2. 模拟实现map和set 2.1 实现出复用红黑树的框架&#xff0c;并支持insert…

《TH-OCR:强大的光学字符识别技术》

在当今数字化的时代&#xff0c;高效准确地将纸质文档、图片中的文字转换为可编辑的电子文本至关重要。而 TH-OCR&#xff08;清华 OCR&#xff09;就是一款在光学字符识别领域表现卓越的软件。 一、TH-OCR 的简介 TH-OCR 是由清华大学电子工程系智能图文信息处理研究室研发的光…

Loss:CornerNet: Detecting Objects as Paired Keypoints

目录 3 CornerNet(角点网络)3.1 概述3.2 检测角点3.2.1 检测角点概述3.2.2 训练中的惩罚调整3.2.3 焦点损失变体计算3.2.4 下采样与偏移量预测3.3 角点分组3.3.1 角点分组的需求与启发3.3.2 关联嵌入在角点分组中的应用3.3.3 “拉近”损失和“推开”损失计算3.4 角点池化3.4.…

echarts饼图前后端代码SpringCloud+Vue3

♥️作者&#xff1a;小宋1021 &#x1f935;‍♂️个人主页&#xff1a;小宋1021主页 ♥️坚持分析平时学习到的项目以及学习到的软件开发知识&#xff0c;和大家一起努力呀&#xff01;&#xff01;&#xff01; &#x1f388;&#x1f388;加油&#xff01; 加油&#xff01…

【网络通信基础与实践第五讲】由浅入深了解路由器的结构设计

我们要实现网络互连&#xff0c;需要一个设备&#xff0c;这个设备可以实现将数据从一个端口转发到另外一个端口&#xff0c;从而实现信息的交换&#xff0c;这个设备就是路由器。 知道了路由器的功能需求&#xff0c;我们就要设计对应的结构来满足这样的需求从而实现相应的功…

【数据结构笔记】图Graph

目录 物理结构 邻接矩阵 矩阵压缩 关联矩阵 邻接表 邻接多重表 图搜索 广度优先搜索BFS 边分类 连通域分解 无权最短路径 深度优先搜索DFS 边分类 双连通分量 优先级优先搜索PFS 单源最短路径问题 Dijkstra算法 Bellman-Ford算法 所有结点对最短路径问题 Fl…

Python语言核心12个必知语法细节

1. 变量和数据类型 Python是动态类型的&#xff0c;变量不需要声明类型。 python复制代码 a 10 # 整数 b 3.14 # 浮点数 c "Hello" # 字符串 d [1, 2, 3] # 列表 2. 条件语句 使用if, elif, else进行条件判断。 python复制代码 x 10 if x > 5: print(&q…

获取首日涨停封盘后第二次交易日上涨/下跌的概率

有许多投资者喜欢在股票涨停封盘后&#xff0c;跟进买入。普通股民会认为一个能在今日涨停封盘的股票&#xff0c;证明其上市公司正有十分重大的利好信息&#xff0c;只需要跟进购买便可以获取短期利益。 我们用数据来看一下在当日涨停封盘后&#xff0c;第二次交易日是上涨还…

JavaWeb——Vue:打包部署(Nginx、目录介绍、部署及启动、访问 )

目录 打包 部署 Nginx 目录介绍 部署及启动 访问 前端 Vue 项目的最后一步是打包部署。在当前前后端分离的开发模式中&#xff0c;前端开发人员开发前端代码&#xff0c;后端开发人员开发后端代码。最终要将开发及测试完毕的前端 Vue 代码和后端代码分开部署在对应的服…

pulsar mq 单体验证demo, docker启动pulsar mq验证生产者消费者命令

1. 进入pulsar # 进入容器 docker exec -it xxx /bin/bash # 进入脚本 cd bin 2. 消费命令&#xff1a; ./pulsar-client consume my-topic -s "fist-subscription" 3. 新增一个创建&#xff0c;重复上述操作&#xff0c;进入bin文件夹&#xff0c;输入生产者命令…

JavaSE——集合9:Map接口实现类—HashTable

目录 一、HashTable基本介绍 二、HashTable底层源码解析 1.初始化数组长度为11&#xff0c;临界值为8(0.75*11)&#xff0c;加载因子是0.75 2.对存放的值进行自动装箱 3.执行put方法 4.计算key的hash值 5.计算索引值&#xff0c;放入table数组中 6.插入重复的key会被替…

VMware安装Ubuntu虚拟系统

1、准备工作 1&#xff09;下载并安装好VMware虚拟软件&#xff1b; 2&#xff09;下载Ubuntu系统镜像文件。建议下载LTS长期支持版本&#xff0c;下载地址&#xff1a; Ubuntu系统下载 | Ubuntu 2、安装Ubuntux系统 2.1、新建虚拟机 打开VMware软件&#xff0c;在右侧“…

住房公积金 计算器-java方法

计算了一下房贷压力&#xff0c;以全额公积金贷款为例&#xff0c;贷款四十万&#xff0c;等额本金方式还款&#xff0c;房贷利率为2.85%&#xff0c;基本情况就是如下&#xff1a; 还款总额达到 提前还款的好处 按三十年计算&#xff0c;如果第一年借用亲朋好友的钱&#x…

无mac通过iOS Dev Center生成打包证书完整流程

很多人第一次使用uniapp打包ios APP应用的时候&#xff0c;都会遇到一个问题&#xff0c;就是如何生成打包证书。 看了uniapp官网的教程&#xff0c;教程上看到是在iOS Dev Center上创建证书&#xff0c;但是过程中却要求我们使用macOS系统来创建csr文件和p12文件。但是我们没…

【ChatGLM4系列】入门介绍以及API调用

目录 前言一、ChatGLM41-1、模型介绍1-2、关键概念1-3、场景示例1-4、模型概览 二、快速开始2-1、安装2-2、Demo案例2-3、请求参数2-4、异步调用 三、模型工具3-1、通用Web搜索3-2、函数调用3-3、增强检索3-4、文件问答 总结 前言 GLM 全名 General Language Model &#xff0c…