【Tauri + React 实战】VCluster - 配置应用图标与启动闪屏

news2024/11/25 4:52:28

本节我们将为 Tauri 应用自定义应用图标的启动闪屏

起步

通过 npm create tauri-app@latest 我们成功创建了一个空白的 Tauri 项目,npm install安装好依赖后,通过 npm run tauri dev 即可开启热加载:
base

配置图标

官方示例很酷,但开发我们自己的应用自然要用自己的 logo。

准备源文件

我事先准备好了 VCluster 的logo(logo.png):
logodemo
注意你要准备的 logo 源文件是一张 PNG 图片,而不是 svg,原因稍后会讲。

点开我们的 Tauri 项目目录,在 src-tauri 下面有一个 icons 目录,这里放着 Tauri 应用全平台的图标文件,种类非常齐全,有不同尺寸的 png ,还有 ico 和 icns。ico 和 icns 分别是 Tauri 应用在 macOS 和 Windows 上所使用的图标文件,linux 则使用的是 png。

那么这么多的图标文件,我们要如何制作呢?需要我们一个个去手动生成吗?自然不用,tauri-cli 会出手。

构建图标

npm run tauri icon <file> [-o -v]

我们将 logo.png 文件放到项目根目录下,然后运行 npm run tauri icon logo.png 即可为我们的 logo 生成全平台所有尺寸的 logo 文件到 src-tauri\icons 目录下,如果我们想要更改 logo 文件的位置,加上选项 -o <OUTPUT> 或者 --output <OUTPUT> 即可变更输出路径,同时,我们要更改 tauri 加载图标的配置:
打开 src-tauri 目录下的 tauri.config.json:

...
  "tauri": {
    "allowlist": {
      "all": false,
      "shell": {
        "all": false,
        "open": true
      }
    },
    "bundle": {
      "active": true,
      "targets": "all",
      "identifier": "com.tauri.dev",
      "icon": [
        "icons/32x32.png",
        "icons/128x128.png",
        "icons/128x128@2x.png",
        "icons/icon.icns",
        "icons/icon.ico"
      ]
    },
...

修改 tauri.bundle 下的 icon 为我们希望的路径即可。

配置启动闪屏

一个桌面应用从双击到可用,是有一段的加载时间的,如果很短那没关系,但稍微长点用户就会不耐烦,因此需要让我们的桌面应用在启动时,展示一个临时的闪屏(splashscreen),等到程序加载完成,闪屏自动关闭,让加载完毕的程序界面呈现在用户的面前。

在 Tauri 中的闪屏,其实就是一个新的窗口,启动应用时,显示闪屏即可。因此我们需要写一个简单的 splashscreen.html 来作为我们的闪屏。

编写闪屏页面

在根目录下的 public 目录下创建一个 splashscreen.html,并拷贝一份咱们的 logo 文件,然后写一个简单的界面:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>SplashScreen</title>
</head>
<body>
    <img src="./logo.png" class="splash-logo" alt="splash-logo">
</body>
</html>
<style>
body {
    background: none;
}
.splash-logo {
  position: absolute;
  height: 60vmin;
  left: calc(50vw - 30vmin);
  top: calc(50vh - 30vmin);
  pointer-events: none;
}

@media (prefers-reduced-motion: no-preference) {
  .splash-logo {
    animation: splash-logo-spin infinite 1s linear;
  }
}

.splash-link {
  color: #61dafb;
}

@keyframes splash-logo-spin {
  0% {
    opacity: 0%;
    transform: rotate(0deg);
  }
  50% {
    opacity: 100%;
    transform: rotate(180deg);
  }
  100% {
    opacity: 0%;
    transform: rotate(360deg);
  }
}

</style>

我这里让 logo 以一个合适大小摆在页面的中心,并用 CSS 实现了一个渐变转圈的动态特效,这样加载的时候看着比较活跃,如果你的程序有着极长的加载时间(1min+ ??),你甚至可以在上面写点可以交互的东西。

配置闪屏页面

写好了闪屏,接下来就要让 Tauri 去在启动的时候打开我们的闪屏页面,先变更 tauri.config.json:
找到 windows 项,加一个新窗口,url 设置为我们的闪屏文件,是从 public 读取的,因此放在 public 下就不用写什么前缀路径了;窗口 label 命名为 splashscreen,名字后面要用到;center设置为 true,显示在屏幕正中间会比较美观,否则在屏幕靠左一侧:

...
    "windows": [
      {
        "fullscreen": false,
        "height": 600,
        "minHeight": 600,
        "resizable": true,
        "title": "VCluster",
        "width": 800,
        "center": true,
        "visible": false
      },
      {
        "width": 800,
        "height": 600,
        "decorations": false,
        "center": true,
        "url": "splashscreen.html",
        "label": "splashscreen"
      }
    ]
...

此时重启我们的 Tauri 应用,你会发现有 2个 窗口同时显示,而且闪屏关不掉,这不是我们想要的效果,接下来该怎么做?
splash

后端调度窗口

Tauri 官方文档给出的方法是,在 rust 后端里面,去控制我们的闪屏和主屏的显示:

  1. 打开 src-tauri\src\main.rs,找到主函数中tauri::Builder::default()这一段:
// Prevents additional console window on Windows in release, DO NOT REMOVE!!
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]

// Learn more about Tauri commands at https://tauri.app/v1/guides/features/command
#[tauri::command]
fn greet(name: &str) -> String {
    format!("Hello, {}! You've been greeted from Rust!", name)
}

fn main() {
    tauri::Builder::default()
        .invoke_handler(tauri::generate_handler![greet])
        .run(tauri::generate_context!())
        .expect("error while running tauri application");
}
  1. 我们为其添加 setup 阶段的事件:setup阶段,后端先获取闪屏和主屏的实例,然后在tauri::async_runtime::spawn 中进行我们程序的初始化操作,比如我这里注释掉的部分是已经开发到后期的 vcluster 初始化数据库驱动的一个操作,现在我们还没有类似需要耗时初始的东西,就先用线程睡眠阻塞替代一下,我先睡了 1秒 模拟程序加载,然后在初始化完毕后又睡了1秒(轻量级应用往往加载很快,闪屏很可能只一闪而过,我们手动延长一下未尝不可,前提是你非常肯定你的程序加载时间很短),这之后我们指示闪屏实例通过 close() 关闭闪屏,并让 主屏实例 show() 展示
//...
    tauri::Builder::default()
        .setup(|app| {
          let splashscreen_window = app.get_window("splashscreen").unwrap();
          let main_window = app.get_window("main").unwrap();
          // we perform the initialization code on a new task so the app doesn't freeze
          tauri::async_runtime::spawn(async move {
            // initialize your app here instead of sleeping :)
            println!("Initializing...");
            //logger::console("Initializing...");
            //RB.init(SqliteDriver{},"sqlite:vcluster.db").unwrap();
            //util::init().await;
            std::thread::sleep(std::time::Duration::from_secs(1));
            println!("Done initializing.");
            //logger::console("Done initializing.");

            // After it's done, close the splashscreen and display the main window
            thread::sleep(time::Duration::from_millis(1000));
            splashscreen_window.close().unwrap();
            main_window.show().unwrap();
          });
          Ok(())
        })
//...

此时,我们的闪屏就可以正常工作了!

  1. 上面这一步是等待后端加载完成,有时候可能是前端加载更慢,就需要在前端中去操作我们的闪屏和主屏。
    先在后台准备一个 tauri 命令,用于关闭闪屏和显示主屏:
#[tauri::command]
async fn close_splashscreen(window: tauri::Window) {
  // Close splashscreen
  if let Some(splashscreen) = window.get_window("splashscreen") {
    splashscreen.close().unwrap();
  }
  // Show main window
  window.get_window("main").unwrap().show().unwrap();
}

在tauri::Builder阶段中绑定这个命令:

    .invoke_handler(tauri::generate_handler![
       close_splashscreen,
       greet])

然后在前端中去监听 DOM 加载即可:

// With the Tauri API npm package:  
import { invoke } from '@tauri-apps/api/tauri'
document.addEventListener('DOMContentLoaded', () => {  
// This will wait for the window to load, but you could  
// run this function on whatever trigger you want  
invoke('close_splashscreen')  
})

至此,Tauri 应用的图标和闪屏配置就到此完成。

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

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

相关文章

数仓报表数据导出——Hive数据导出至Clickhouse

1. Clickhouse建表 创建database create database ad_report; use ad_report;创建table drop table if exists dwd_ad_event_inc; create table if not exists dwd_ad_event_inc (event_time Int64 comment 事件时间,event_type String comment 事件…

运营实操,如何寻找自己产品的精准关键词

在进行Listing优化时&#xff0c;许多卖家感到困惑&#xff0c;不知从何入手。尽管他们听过许多关于优化的文章&#xff0c;但实际操作时仍不清楚何为好的标准。 亚马逊产品列表的另一个重要元素是图片。图像体验很大程度上决定了客户是否会继续浏览&#xff0c;仅仅依靠文字故…

Linux--查看man手册中某个函数的库函数

第一步&#xff1a;man 函数名 第二步&#xff1a;查看是否存在 第三步&#xff1a;如果不存在&#xff0c;则输入man 2 exit依次类推3、4.....

STM32开发笔记:中断

一、中断系统 中断&#xff1a;在主程序运行过程中&#xff0c;出现了特定的中断触发条件&#xff08;中断源&#xff09;&#xff0c;使得CPU暂停当前正在运行的程序&#xff0c;转而去处理中断程序&#xff0c;处理完成后又返回原来被暂停的位置继续运行。 中断优先级&#x…

c++11 标准模板(STL)(std::basic_istream)(九)

定义于头文件 <istream> template< class CharT, class Traits std::char_traits<CharT> > class basic_istream : virtual public std::basic_ios<CharT, Traits> 类模板 basic_istream 提供字符流上的高层输入支持。受支持操作包含带格式的…

静态数码管显示

学习芯片&#xff1a; EP4CE6F17C8 本次学习使用的为共阴极数码管&#xff0c;即用低电平点亮数码管&#xff0c;同样可知&#xff0c;共阳极数码管的阳极连在一起&#xff0c;即用高电平点亮数码管。 八段数码管示意图&#xff1a; a,b,c,d,e,f,g,dg表示八段数码管时&#…

分类预测 | MATLAB实现基于Attention-LSTM的数据分类预测多特征分类预测(长短期记忆网络融合注意力机制分类预测,含混淆矩阵图、分类图)

分类预测 | MATLAB实现基于Attention-LSTM的数据分类预测多特征分类预测(长短期记忆网络融合注意力机制分类预测&#xff0c;含混淆矩阵图、分类图) 目录 分类预测 | MATLAB实现基于Attention-LSTM的数据分类预测多特征分类预测(长短期记忆网络融合注意力机制分类预测&#xff…

mybatis例子,以及静态资源过滤问题解决

第一步&#xff1a;编写一个工具类 package com.heerlin.utils;import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder;imp…

Spring Boot 源码学习之@SpringBootApplication注解

SpringBootApplication 注解 引言主要内容1. 创建 Spring Boot 项目2. Spring Boot 入口类3. SpringBootApplication 介绍 总结 引言 在 Huazie 前面的博文 《Spring Boot 核心运行原理介绍》中&#xff0c;我们初步了解了 Spring Boot 核心运行原理&#xff0c;知道了 Enable…

#挑战Open AI!马斯克宣布成立xAI,你怎么看?# 马斯克的xAI:充满困难与希望

文章目录 1.什么是xAI公司&#xff1f;2.xAI公司的图标3.“反AI斗士”马斯克进军AI&#xff1a;期待与挑战并存3.1 关于马斯克……3.2 这位“反AI斗士”……3.3 我的看法3.4 可能会遇到的困难与优势3.5 蓄谋已久的马斯克……3.6 xAI“全明星阵容”3.7 总结 4.百模大战&#xff…

git第一次拉取远程分支项目(ssh的方式)

一.生成SSH keys,并将生成的key复制到远程库 1.本地用命令生成密钥对。 ssh-keygen -t rsa -C "yourEmailAddress" 或 ssh-keygen -t ed25519 -C "yourEmailAddress" 按三次enter直接生成密钥对。 2.切换至ssh目录下&#xff0c;复制key&#xff08;公…

软件测试值不值得学,2023软件测试行情分析

目录 1、人们的生活离不开软件&#xff0c;有软件的地方就有测试 2、测试工程师特别是自动化测试工程师的需求会越来越大 3、软件测试经验越丰富越受欢迎&#xff0c;不存在35岁限制。 4、所有新兴行业比如chat-gtp&#xff0c;车载系统等都需要测试工程师 薪资 就业 软…

设计模式——桥梁模式

桥梁模式 定义 桥梁模式&#xff08;Bridge Pattern&#xff09;也叫做桥接模式。 将抽象和显示解耦&#xff0c;使得两者可以独立地变化。 优缺点、应用场景 优点 抽象和实现的解耦。 这是桥梁模式的主要特点&#xff0c;它完全是为了解决继承的缺点而提出的设计模式。优…

从C到C++ | C++入门(二)

目录 缺省参数 1.)全缺省 2.)半缺省 函数重载 1.) 参数类型不同 2.) 参数个数不同 3.) 参数顺序不同 函数重载的原理&#xff1a; &#xff01;&#xff01;&#xff01;注意 &#xff01;&#xff01;&#xff01; 引用 1.) 引用做参数 2.) 引用做返回值 引用和…

C#使用DataGridView模拟绘图

接到一个需求&#xff0c;绘制一个水管线的图片&#xff0c;这种管线可以有12种分段方法&#xff0c;最后将这12种分段方法合并后在一条水管线上展示&#xff0c;要求&#xff1a; ⒈支持分段的属性展示&#xff1b; ⒉要求每个分段都能清晰展示&#xff0c;分段数在0&#xff…

一天吃透JVM面试八股文

内容摘自我的学习网站&#xff1a;topjavaer.cn 什么是JVM&#xff1f; JVM&#xff0c;全称Java Virtual Machine&#xff08;Java虚拟机&#xff09;&#xff0c;是通过在实际的计算机上仿真模拟各种计算机功能来实现的。由一套字节码指令集、一组寄存器、一个栈、一个垃圾回…

C++11(1)——新增用法零碎总结

目录 1. C11简介 2. 统一的列表初始化 2.1 &#xff5b;&#xff5d;初始化 2.2 std::initializer_list std::initializer_list是什么类型&#xff1a; std::initializer_list使用场景&#xff1a; 让模拟实现的vector也支持{}初始化和赋值 1. C11简介 在2003年C标准委员会…

【雕爷学编程】Arduino动手做(163)---大尺寸8x8LED方格屏模块2

37款传感器与模块的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&#x…

学无止境·MySQL⑧(Redis)

Redis和Mongodb练习 Redis1、安装redis2、string类型数据的命令操作&#xff1a;设置键值&#xff1a;读取键值数值类型自增1数值类型自减1查看值的长度 3、list类型数据的命令操作对列表city插入元素&#xff1a;Shanghai Suzhou Hangzhou将列表city里的头部的元素移除将name列…

AI炒股:用Claude来分析A股2023年中报业绩预告

Claude是和ChatGPT类似的AI大模型&#xff0c;据测试 AI 的水平能力接近 GPT-4&#xff0c;支持高达 100K token 的上下文。Claude只需要到官方网站注册账号后就可以直接免费使用。不过&#xff0c;目前智能美国和英国的 IP 可以注册和使用。 Claude支持上传文档功能&#xff…