【实战】Electron桌面下雪特效实战文字版(附视频链接)

【实战】Electron桌面下雪特效实战文字版(附视频链接)文章目录一、构建环境二、窗口透明化三、添加雪花四、移动雪花五、雪花旋转六、参数随机七、完成下雪特效八、打包成可执行文件打包方法1打包方法2九、全部代码展示工程目录package.jsonindex.htmlmain.jsSnowFlower.jsrenderer.jsElectron桌面下雪特效_哔哩哔哩(゜-゜)つロ干杯~-bilibili配套源码地址一、构建环境git…


Electron桌面下雪特效_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili

配套源码地址


一、构建环境

git clone https://github.com/atom/electron-quick-start
mv electronic-quick-start g-snow
cd g-snow
npm install && npm start

hello world 出现

二、窗口透明化

修改main.js

mainWindow = new BrowserWindow({ 
   
    alwaysOnTop: true,   // 窗口始终置顶
    frame: false,    // 窗口无边框
    transparent: true,   // 窗体透明
    resizable: false,	// 窗口大小不可调
});

index.html中删掉多余内容后,添加样式:

    ...
    <style> html, body { 
      width: 100%; height: 100%; overflow: hidden; background-color: #00000066; } </style>
  </head>
  <body>
    <script src="./renderer.js"></script>
  </body>

在main.js中引入electron

const electron = require('electron')

接着获取屏幕尺寸

function createWindow () { 
   
    let area = electron.screen.getPrimaryDisplay().workAreaSize;
    ...

并赋值给窗口

const mainWindow = new BrowserWindow({ 
   
    width: area.width,
    height: area.height,
    x:0y:0,
    ...

此时窗口布满全屏

三、添加雪花

  • 引入资源文件并通过img标签添加到index.html中
<img src="res/snowflower.png" width="10">
  • 创建SnowFlower.js
class SnowFlower{ 
   
    constructor() { 
   
	    this._img = document.createElement('img')
		this._img.src = 'res/SnowFlower.png'
	}
	get img(){ 
   
		return this._img
	}
}
module.exports = SnowFlower
```js 在renderer.js中引入SnowFlower类,并创建“雪花元素” ```js
const SnowFlower = require('./SnowFlower.js')
document.body.appendChild(new SnowFlower().img)

在main.js中添加允许使用node.js

const mainWindow = new BrowserWindow({ 
   
    ...
    webPreferences: { 
   
      preload: path.join(__dirname, 'preload.js'),
      nodeIntegration: true     // 允许使用node.js
    }

四、移动雪花

在SnowFlower类的构造方法中初始化雪花位置和速度

this.x = 0
this.y = 0
this.speedX = 1
this.speedY = 1

在类中创建move函数

move(){ 
   
    this.x += this.speedX
    this.y += this.speedY
    this.img.style.transform = `translate(${ 
     this.x}px,${ 
     this.y}px)`
	requestAnimationFrame(this.moveBindThis)
}

在构造方法里把move()函数绑定上下文对象,以确保move方法中可以通过this进行回调

this.moveBindThis = this.move.bind(this)

在构造方法里通过绑定方法执行move函数

this.moveBindThis()

此时运行就可以看到雪花移动了,附上SnowFlower.js目前全部代码

class SnowFlower{ 
   
	constructor() { 
   
	    this._img = document.createElement('img')
		this._img.src = 'res/snowflower.png'
		this.x = 0
		this.y = 0
		this.speedX = 1
		this.speedY = 1
		this.moveBindThis = this.move.bind(this)
		this.moveBindThis()
	}
	get img(){ 
   
		return this._img
	}
	move(){ 
   
		this.x += this.speedX
		this.y += this.speedY
		this.img.style.transform = `translate(${ 
     this.x}px,${ 
     this.y}px)`
		requestAnimationFrame(this.moveBindThis)
	}
}
module.exports = SnowFlower

五、雪花旋转

在SnowFlower类的构造方法中初始化雪花旋转角度和速度

this.rotation = 0
this.speedRotation = 1

在move方法中添加

this.rotation += this.speedRotation

并修改

this.img.style.transform = `translate(${ 
     this.x}px,${ 
     this.y}px)`

=>

this.img.style.transform = `translate(${ 
     this.x}px,${ 
     this.y}px) rotate(${ 
     this.rotation}deg)`

查看效果,现在雪花边旋转边移动,附上SnowFlower.js目前全部代码

class SnowFlower{ 
   
	constructor() { 
   
	    this._img = document.createElement('img')
		this._img.src = 'res/snowflower.png'
		
		this.x = 0
		this.y = 0
		this.speedX = 1
		this.speedY = 1
		this.rotation = 0
		this.speedRotation = 1
		
		this.moveBindThis = this.move.bind(this)
		this.moveBindThis()
	}
	get img(){ 
   
		return this._img
	}
	move(){ 
   
		this.x += this.speedX
		this.y += this.speedY
		this.rotation += this.speedRotation
		this.img.style.transform = `translate(${ 
     this.x}px,${ 
     this.y}px) rotate(${ 
     this.rotation}deg)`
		requestAnimationFrame(this.moveBindThis)
	}
}
module.exports = SnowFlower

六、参数随机

在SnowFlower类的构造方法中修改雪花的旋转方向和速度为随机

this.speedRotation = (Math.random() + 1) * (Math.random() > 0.5 ? 1 : -1)

在renderer.js中,将引入雪花的语句嵌套进循环中,来增加雪花数量

for(let i=0;i<12;i++){ 
   
	document.body.appendChild(new SnowFlower().img)
}

在index.html中使用css初始化雪花位置

img { 
   
	display: block;
    position: fixed;
}

在SnowFlower类的构造方法中调整雪花速度随机

this.speedX = (Math.random() + 1)/5 * (Math.random() > 0.5 ? 1 : -1)
this.speedY = (Math.random() + 1)/2

雪花大小随机

this._img.width = Math.random() * 7 + 3

要想雪花初始位置随机需要先获取屏幕尺寸信息

在SnowFlower类文件中引入electron

const electron = require('electron')
const workAreaSize = electron.remote.screen.getPrimaryDisplay().workAreaSize

在SnowFlower类的构造方法中设置雪花初始位置随机

this.x = Math.random() * workAreaSize.width

在move()方法中设置雪花越界移除,并在不越界的情况下才继续移动

if(this.x > workAreaSize.width || this.x < 0 || this.y > workAreaSize.height){ 
   
	if(this._img.parentNode){ 
   
		this._img.parentNode.removeChild(this._img)
	}
}else{ 
   
	requestAnimationFrame(this.moveBindThis)
}

七、完成下雪特效

持续制造雪花:每隔1秒制造一次,将制造雪花代码嵌套进去
renderer.js

setInterval(()=>{ 
   
	for(let i=0;i<10;i++){ 
   
		document.body.appendChild(new SnowFlower().img)
	}
},1000)

在SnowFlower类的构造方法中将“天空”抬高一些,显得更自然一些

this.y = -20

让雪花特效不影响正常电脑使用:忽略鼠标事件
main.js

function createWindow () { 
   
    ...
    mainWindow.setIgnoreMouseEvents(true)		// 忽略鼠标事件
    ...
}

去掉背景色

完成!

八、打包成可执行文件

打包方法1

下载打包器

cnpm i -g electron-packager

直接打包

electron-packager . 'g-snow' --platform=win32 --arch=x64 --icon=snow.ico --out=./out --asar --app-version=0.0.1

或是配置package.json的scripts

"scripts": {
    ...
	"pkg": "electron-packager . g-snow --platform=win32 --arch=x64 --icon=snow.ico --out=./out --asar --app-version=0.0.1"
  },

在命令行中执行npm run pkg

尝试并没有成功,发现了第二种更好的方法,舍弃第一种。。。

打包方法2

在package.json中做如下配置

  "build": { 
   
	  "productName":"桌面雪花生成器",
      "appId": "top.aimooc.app",
      "mac": { 
   
        "target": ["dmg","zip"]
      },
      "win": { 
   
        "target": ["nsis","zip"]
      },
	  "nsis": { 
   
		"oneClick": false,
		"allowElevation": true,
		"allowToChangeInstallationDirectory": true,
		"createDesktopShortcut": true,
		"createStartMenuShortcut": true
	  },
	  "files": ["**/*","res/snowflower.png"]
  },
  "scripts": { 
   
    "start": "electron .",
	"pkg": "electron-packager . g-snow --platform=win32 --arch=x64 --icon=icon.ico --out=./out --asar --app-version=0.0.1",
	"dist": "electron-builder --win --x64"
  },

在命令行中执行npm run dist

配置的详细解释参见:electron打包(electron-builder/electron-packager)及打包过程中的报错解决

打包过程中出现因网络原因导致的报错参见:electron-builder打包过程中报错——网络下载篇

九、全部代码展示

工程目录

.
|-- README.md
|-- SnowFlower.js
|-- icon.ico
|-- index.html
|-- main.js
|-- package.json
|-- preload.js
|-- renderer.js
`-- res
    `-- snowflower.png

package.json

{ 
   
  "name": "g-snow",
  "version": "1.0.0",
  "description": "下雪特效",
  "main": "main.js",
  "build": { 
   
	  "productName":"桌面雪花生成器",
      "appId": "top.aimooc.app",
      "mac": { 
   
        "target": ["dmg","zip"]
      },
      "win": { 
   
        "target": ["nsis","zip"]
      },
	  "nsis": { 
   
		"oneClick": false,
		"allowElevation": true,
		"allowToChangeInstallationDirectory": true,
		"createDesktopShortcut": true,
		"createStartMenuShortcut": true
	  },
	  "files": ["**/*","res/snowflower.png"]
  },
  "scripts": { 
   
    "start": "electron .",
	"pkg": "electron-packager . g-snow --platform=win32 --arch=x64 --icon=icon.ico --out=./out --asar --app-version=0.0.1",
	"dist": "electron-builder --win --x64"
  },
  "repository": "https://gitee.com/OliverDaDa/g-snow",
  "keywords": [
    "Electron",
    "quick",
    "start",
    "snow",
    "demo"
  ],
  "author": "AImooc-Oliver",
  "license": "CC0-1.0",
  "devDependencies": { 
   
    "electron": "^8.2.0"
  }
}

index.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>g-snow</title>
	<style> html, body { 
      width: 100%; height: 100%; overflow: hidden; } img { 
      display: block; position: fixed; } </style>
  </head>
  <body>
    <script src="./renderer.js"></script>
  </body>
</html>

main.js

const { 
   app, BrowserWindow} = require('electron')
const path = require('path')
const electron = require('electron')
// var globalShortcut = electron.globalShortcut

function createWindow () { 
   
  let area = electron.screen.getPrimaryDisplay().workAreaSize;
  // Create the browser window.
  const mainWindow = new BrowserWindow({ 
   
    width: area.width,
    height: area.height,
	x:0,
	y:0,
	alwaysOnTop: true,   // 窗口始终置顶
	frame: false,    // 窗口无边框
	transparent: true,   // 窗体透明
	resizable: false,	// 窗口大小不可调
    webPreferences: { 
   
      preload: path.join(__dirname, 'preload.js'),
      nodeIntegration: true     // 允许使用node.js
    }
  })
  
  mainWindow.setIgnoreMouseEvents(true)		// 忽略鼠标事件

  mainWindow.loadFile('index.html')
  // globalShortcut.register('ctrl+e',()=>{ 
   
  // mainWindow.webContents.openDevTools()
  // })
}

app.whenReady().then(createWindow)

app.on('window-all-closed', function () { 
   
  if (process.platform !== 'darwin') app.quit()
})

app.on('activate', function () { 
   
  if (BrowserWindow.getAllWindows().length === 0) createWindow()
})

SnowFlower.js

const electron = require('electron')
const workAreaSize = electron.remote.screen.getPrimaryDisplay().workAreaSize

class SnowFlower{ 
   
	constructor() { 
   
	    this._img = document.createElement('img')
		this._img.src = 'res/snowflower.png'
		this._img.width = Math.random() * 7 + 3
		
		this.x = Math.random() * workAreaSize.width
		this.y = -20
		this.speedX = (Math.random() + 1)/7 * (Math.random() > 0.5 ? 1 : -1)
		this.speedY = (Math.random() + 1)
		this.rotation = 0
		this.speedRotation = (Math.random() + 1) * (Math.random() > 0.5 ? 1 : -1)
		
		this.moveBindThis = this.move.bind(this)
		this.moveBindThis()
	}
	get img(){ 
   
		return this._img
	}
	move(){ 
   
		this.x += this.speedX
		this.y += this.speedY
		this.rotation += this.speedRotation
		
		this.img.style.transform = `translate(${ 
     this.x}px,${ 
     this.y}px) rotate(${ 
     this.rotation}deg)`
		
		if(this.x > workAreaSize.width || this.x < 0 || this.y > workAreaSize.height){ 
   
			if(this._img.parentNode){ 
   
				this._img.parentNode.removeChild(this._img)
			}
		}else{ 
   
			requestAnimationFrame(this.moveBindThis)
		}
	}
}
module.exports = SnowFlower

renderer.js

const SnowFlower = require('./SnowFlower.js')
setInterval(()=>{ 
   
	for(let i=0;i<12;i++){ 
   
		document.body.appendChild(new SnowFlower().img)
	}
},1000)

PS:打包后以及编写过程中可在main.js中写如下代码创建打开DevTools的快捷键ctrl+e来快速debug(记得注释掉 忽略鼠标事件 的代码)

// var globalShortcut = electron.globalShortcut
function createWindow () {
  ...
  // globalShortcut.register('ctrl+e',()=>{
  // 	mainWindow.webContents.openDevTools()
  // })
}

完整项目地址:g-snow

成品下载地址:桌面雪花生成器 Setup 1.0.0.exe


制作过程中使用到的网站,在此感谢!!

在线生成透明ICO图标——ICO图标制作

electron/electron-quick-start

Electron桌面下雪特效_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili

特别感谢视频作者,侵权立删!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/37536.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注