首頁 > 軟體

Electron應用顯示隱藏時展示動畫效果範例

2022-05-29 14:00:22

最終效果

實現思路

視窗設定透明

建立系統托盤

獲取托盤座標,實現應用在托盤上方出現

CSS 裡面寫上載入和退出的動畫

新增載入動畫的事件,即給元素套上動畫

設定單擊事件,單擊顯示或者隱藏程式(或者新增 blur 事件,隱藏應用)

給托盤新增右鍵選單退出應用

實現過程

視窗設定透明

const win = new BrowserWindow({
    width: 300,
    height: 400,
    frame: false, // 視窗邊框
    skipTaskbar: true, // 視窗是否不顯示在工作列上面
    alwaysOnTop: true, // 視窗置頂
    transparent: true, // 視窗透明
    resizable: false,
    webPreferences: {
        // 通訊檔案 後面會用到
        preload: path.join(__dirname, "preload.js"),
        backgroundThrottling: false, // 後臺執行是否禁止一些操作
    },
});

建立系統托盤

import { Tray } from "electron";

// 傳入圖示路徑
tray = new Tray(path.join(__dirname, "../../public/imgs/logo.ico"));

// 滑鼠懸浮托盤時顯示的文字
tray.setToolTip("Todo");

獲取托盤座標,實現應用在托盤上方

// 獲取托盤所在位置資訊
const { width, height, x, y } = tray.getBounds();

// 獲取視窗資訊 win 是 BrowserWindow 物件
const [w, h] = win.getSize();

// 剛好在正上方
win.setPosition(x + width / 2 - w / 2, y - h - 10);

// 封裝成函數
const aboveTrayPosition = (win, tray) => {
    const { width, height, x, y } = tray.getBounds();
    const [w, h] = win.getSize();
    return [x + width / 2 - w / 2, y - h - 10]
}

CSS 裡面寫上載入和退出的動畫

動畫應該新增到HTML根元素上,根元素必須得是 寬高 100%

@keyframes show {
    0% {
        opacity: 0;
        transform: translateY(300px) scale(0);
    }
    100% {
        opacity: 1;
        transform: translateY(0) scale(1);
    }
}

@keyframes hide {
    0% {
        opacity: 1;
        transform: translateY(0) scale(1);
    }
    100% {
        opacity: 0;
        transform: translateY(300px) scale(0);
    }
}

新增載入動畫的事件

// preload.js
import { ipcRenderer } from "electron";

// 對應下面的 win.webContents.send("show");
// 預設有個 event 事件引數
ipcRenderer.on("show", (e) => {
    const root = document.querySelector(".root") as HTMLElement;
    root.style.animation = "show 0.3s linear forwards";
});

// 對應下面的 win.webContents.send("hide", s);
ipcRenderer.on("hide", (e, s: number) => {
    const root = document.querySelector(".root") as HTMLElement;
    root.style.animation = `hide ${s}s linear forwards`;
});

設定單擊事件,單擊顯示或者隱藏程式並載入動畫

// 新增托盤圖示單擊事件
tray.on("click", () => {
    // 視窗是否隱藏
    if (!win.isVisible()) {
        win.setPosition(...aboveTrayPosition(win, tray));
        win.show();
        
        // 展示載入動畫
        win.webContents.send("show");
    } else {
        
        const s = 0.3;
        // 展示退出動畫
        win.webContents.send("hide", s);
        
        // 退出動畫載入完之後再隱藏程式
        setTimeout(() => {
            win.hide();
        }, s * 1000);
    }
});

給托盤新增右鍵選單退出應用

import { Menu } from "electron";

// 建立選單
let menu: Menu = Menu.buildFromTemplate([
    {
        label: "Quit",
        click() {
            app.quit();
        },
    },
]);

// 掛載到托盤右鍵上
tray.setContextMenu(menu);

總結

到此這篇關於Electron應用顯示隱藏時展示動畫的文章就介紹到這了,更多相關Electron顯示隱藏展示動畫內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com