使用electron制作满屏心特效的示例代码


Posted in Javascript onNovember 27, 2018

本文介绍了使用electron制作满屏心特效的示例代码,分享给大家,具体如下:

使用electron制作满屏心特效的示例代码

图片被压缩了 看起来很难看

使用electron制作满屏心特效的示例代码

主进程代码

import {BrowserWindow, app, ipcMain} from 'electron'

createWindow();

ipcMain.on('quitApp', () => {
  app.quit();
});

function createWindow() {

  const loginURL = process.env.NODE_ENV === 'development' ? `http://localhost:9080` : `file://${__dirname}/index.html`;
  const win = new BrowserWindow({

    alwaysOnTop: true,
    modal: true,
    width: 1200,
    height: 6500,
    frame: false,
    show: false,
    darkTheme: true,
    resizable: false,
    minimizable: false,
    maximizable: false,
    transparent: true,
    type: 'toolbar',
    webPreferences: {
      devTools: false,
    }
  });
  win.loadURL(loginURL);
  win.once('ready-to-show', () => {
    win.show();
  });
}

渲染进程代码

界面代码

<template>
  <div style="position: absolute;width: 95%;height: 95%;border-radius: 10px;-webkit-app-region: drag">
    <canvas ref="drawHeart" id="drawHeart"></canvas>
  </div>
</template>

js代码

mounted() {
      var hearts = [];
      var canvas = this.$refs.drawHeart;
      var wW = 1920;
      var wH = 1040;
      // 创建画布
      var ctx = canvas.getContext('2d');
      // 创建图片对象
      var heartImage = new Image();
      heartImage.src = img;
      var num = 100;

      init();

      window.addEventListener('resize', function(){
        wW = window.innerWidth;
        wH = window.innerHeight;
      });
      // 初始化画布大小
      function init(){
        canvas.width = wW;
        canvas.height = wH;
        for(var i = 0; i < num; i++){
          hearts.push(new Heart(i%5));
        }
        requestAnimationFrame(render);
      }

      function getColor(){
        var val = Math.random() * 10;
        if(val > 0 && val <= 1){
          return '#00f';
        } else if(val > 1 && val <= 2){
          return '#f00';
        } else if(val > 2 && val <= 3){
          return '#0f0';
        } else if(val > 3 && val <= 4){
          return '#368';
        } else if(val > 4 && val <= 5){
          return '#666';
        } else if(val > 5 && val <= 6){
          return '#333';
        } else if(val > 6 && val <= 7){
          return '#f50';
        } else if(val > 7 && val <= 8){
          return '#e96d5b';
        } else if(val > 8 && val <= 9){
          return '#5be9e9';
        } else {
          return '#d41d50';
        }
      }

      function getText(){
        var val = Math.random() * 10;
        if(val > 1 && val <= 3){
          return '爱你一辈子';
        } else if(val > 3 && val <= 5){
          return '感谢你';
        } else if(val > 5 && val <= 8){
          return '喜欢你';
        } else{
          return 'I Love You';
        }
      }

      function Heart(type){
        this.type = type;
        // 初始化生成范围
        this.x = Math.random() * wW;
        this.y = Math.random() * wH;

        this.opacity = Math.random() * .5 + .5;

        // 偏移量
        this.vel = {
          x: (Math.random() - .5) * 5,
          y: (Math.random() - .5) * 5
        }

        this.initialW = wW * .5;
        this.initialH = wH * .5;
        // 缩放比例
        this.targetScale = Math.random() * .15 + .02; // 最小0.02
        this.scale = Math.random() * this.targetScale;

        // 文字位置
        this.fx = Math.random() * wW;
        this.fy = Math.random() * wH;
        this.fs = Math.random() * 10;
        this.text = getText();

        this.fvel = {
          x: (Math.random() - .5) * 5,
          y: (Math.random() - .5) * 5,
          f: (Math.random() - .5) * 2
        }
      }

      Heart.prototype.draw = function(){
        ctx.save();
        ctx.globalAlpha = this.opacity;
        ctx.drawImage(heartImage, this.x, this.y, this.width, this.height);
        ctx.scale(this.scale + 1, this.scale + 1);
        if(!this.type){
          // 设置文字属性
          ctx.fillStyle = getColor();
          ctx.font = 'italic ' + this.fs + 'px sans-serif';
          // 填充字符串
          ctx.fillText(this.text, this.fx, this.fy);
        }
        ctx.restore();
      }
      Heart.prototype.update = function(){
        this.x += this.vel.x;
        this.y += this.vel.y;

        if(this.x - this.width > wW || this.x + this.width < 0){
          // 重新初始化位置
          this.scale = 0;
          this.x = Math.random() * wW;
          this.y = Math.random() * wH;
        }
        if(this.y - this.height > wH || this.y + this.height < 0){
          // 重新初始化位置
          this.scale = 0;
          this.x = Math.random() * wW;
          this.y = Math.random() * wH;
        }

        // 放大
        this.scale += (this.targetScale - this.scale) * .1;
        this.height = this.scale * this.initialH;
        this.width = this.height * 1.4;

        // -----文字-----
        this.fx += this.fvel.x;
        this.fy += this.fvel.y;
        this.fs += this.fvel.f;

        if(this.fs > 50){
          this.fs = 2;
        }

        if(this.fx - this.fs > wW || this.fx + this.fs < 0){
          // 重新初始化位置
          this.fx = Math.random() * wW;
          this.fy = Math.random() * wH;
        }
        if(this.fy - this.fs > wH || this.fy + this.fs < 0){
          // 重新初始化位置
          this.fx = Math.random() * wW;
          this.fy = Math.random() * wH;
        }
      }

      function render(){
        ctx.clearRect(0, 0, wW, wH);
        for(var i = 0; i < hearts.length; i++){
          hearts[i].draw();
          hearts[i].update();
        }
        requestAnimationFrame(render);
      }

    }

扩展功能

全屏展示

const size = screen.getPrimaryDisplay().workAreaSize;  //获取显示器的宽高
win.setSet(size.width size.height);
win.setPosition(0,0);

这样就会让窗口全屏 但是有一个问题 就是这样做界面不会正确响应 我们可以使用进程通信去解决

win.webContents.sen('windowSize',size);

之后再主进程中监听就行了

窗口点击穿透

以上代码会有一个问题 就是一旦运行 就不能关闭了

win.setIgnoreMouseEvents(true) 就可以让界面只做展示使用 鼠标可以点击你窗口的任意区域

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
setTimeout和setInterval的浏览器兼容性分析
Feb 27 Javascript
extjs 学习笔记 四 带分页的grid
Oct 20 Javascript
SyntaxHighlighter语法高亮插件使用说明
Aug 14 Javascript
jQuery实现单行文字间歇向上滚动源代码
Jun 02 Javascript
jquery实现表格本地排序的方法
Mar 11 Javascript
JavaScript数据结构与算法之链表
Jan 29 Javascript
关于两个jQuery(js)特效冲突的bug的解决办法
Sep 04 Javascript
jQuery自定义图片上传插件实例代码
Apr 04 jQuery
Vuejs 实现简易 todoList 功能 与 组件实例代码
Sep 10 Javascript
JSON基本语法及与JavaScript的异同实例分析
Jan 04 Javascript
js回调函数仿360开机
Dec 26 Javascript
JavaScript代码简化技巧实例解析
Sep 09 Javascript
30分钟快速实现小程序语音识别功能
Nov 27 #Javascript
基于Koa2写个脚手架模拟接口服务的方法
Nov 27 #Javascript
Vue实现移动端左右滑动效果的方法
Nov 27 #Javascript
vue2.0移动端滑动事件vue-touch的实例代码
Nov 27 #Javascript
详解vuex 渐进式教程实例代码
Nov 27 #Javascript
解决vue 界面在苹果手机上滑动点击事件等卡顿问题
Nov 27 #Javascript
Node+OCR实现图像文字识别功能
Nov 26 #Javascript
You might like
PHP与MySQL开发中页面出现乱码的一种解决方法
2007/07/29 PHP
php class中public,private,protected的区别以及实例分析
2013/06/18 PHP
php 启动时报错的简单解决方法
2014/01/27 PHP
php session 写入数据库
2016/02/13 PHP
JQuery 前台切换网站的样式实现
2009/06/22 Javascript
收集json解析的四种方法分享
2014/01/17 Javascript
Javascript 按位取反运算符 (~)
2014/02/04 Javascript
js实现在同一窗口浏览图片
2014/09/17 Javascript
JQuery分屏指示器图片轮换效果实例
2015/05/21 Javascript
jQuery实现高亮显示网页关键词的方法
2015/08/07 Javascript
jQuery模仿京东/天猫商品左侧分类导航菜单效果
2016/06/29 Javascript
Angularjs中$http以post请求通过消息体传递参数的实现方法
2016/08/05 Javascript
常用js,css文件统一加载方法(推荐) 并在加载之后调用回调函数
2016/09/23 Javascript
js 事件的传播机制(实例讲解)
2017/07/20 Javascript
gulp教程_从入门到项目中快速上手使用方法
2017/09/14 Javascript
vue服务端渲染页面缓存和组件缓存的实例详解
2018/09/18 Javascript
JavaScript中的this原理及6种常见使用场景详解
2020/02/14 Javascript
JavaScript实现点击自制菜单效果
2021/02/02 Javascript
[02:16]DOTA2英雄基础教程 干扰者
2014/01/15 DOTA
[41:20]2014 DOTA2华西杯精英邀请赛 5 24 NewBee VS DK
2014/05/26 DOTA
[01:09:10]NB vs Liquid Supermajor小组赛 A组胜者组决赛 BO3 第一场 6.2
2018/06/04 DOTA
Python中为feedparser设置超时时间避免堵塞
2014/09/28 Python
python生成器表达式和列表解析
2016/03/10 Python
Python实现购物车程序
2018/04/16 Python
Tensorflow之Saver的用法详解
2018/04/23 Python
Python中一般处理中文的几种方法
2019/03/06 Python
Python数据类型之List列表实例详解
2019/05/08 Python
使用Pyhton集合set()实现成果查漏的例子
2019/11/24 Python
用Python自动清理系统垃圾的实现
2021/01/18 Python
html5音频_动力节点Java学院整理
2018/08/22 HTML / CSS
求职简历中自我评价
2014/01/28 职场文书
《小儿垂钓》教学反思
2014/02/23 职场文书
党员服务承诺书
2014/05/28 职场文书
企业授权委托书范本
2014/09/22 职场文书
学校运动会简讯
2015/07/20 职场文书
2016年春季开学典礼新闻稿
2015/11/25 职场文书