这里是最终效果

思路

  1. 可以为canvas设置一个background的作为需要显示的目标图像,然后canvas绘制一个矩形作为遮罩层。或者通过position使用canvas覆盖在image标签上。

  2. 利用canvas的globalCompositeOperation属性可以很方便的操作绘图间的关系,详细可参考 w3school

  3. 因为消除后的图形为透明图形。可以使用getImageData抓取canvas中的图像数据来判断已消除的面积。

实现

把目标图像设置为background

this.canvas.style.background = `url(${this.CONFIG.backgroundUrl}) no-repeat center center`
this.canvas.style.backgroundSize = 'cover'
复制代码

绘制一个遮罩层

drawGrayMask(){this.context.fillStyle = this.CONFIG.fillColorthis.context.fillRect(0,0,this.CONFIG.width, this.CONFIG.height)
}
复制代码

设置绘图效果

if (this.start){// 鼠标/手势 移动时,获取当前坐标 let x = e.touches ? e.touches[0].clientX : e.pageXlet y = e.touches ? e.touches[0].clientY : e.pageY// 设置canvas属性this.context.globalCompositeOperation = 'destination-out'this.drawLine(x, y)this.CONFIG.startX = xthis.CONFIG.startY = y
}
复制代码

判断绘制的图像占整个canvas的比例

// 获取当前透明的面积
for (let i=0; i<datas.length-3; i+=4){if (datas[i] === 0 && datas[i+1] === 0 && datas[i+2] === 0 && datas[i+3] === 0){transparent++}
}// 当透明面积超过总面积50%,清除所有的遮罩层
if(transparent > this.CONFIG.width*this.CONFIG.height*0.5){this.run()
}
复制代码

清除整个遮罩层

clearCanvas(){// 绘制一个面积超过canvas面积的圆this.context.beginPath()this.context.globalCompositeOperation = 'destination-out'this.context.arc(this.CONFIG.width/2, this.CONFIG.height/2, this.CONFIG.currentRadius, 0, 2*Math.PI)this.context.fill()this.context.closePath()
}update(){ if (this.CONFIG.currentRadius < this.CONFIG.width || this.CONFIG.currentRadius<this.CONFIG.height){this.CONFIG.currentRadius *= this.CONFIG.clearSpeed}
}复制代码

转载于:https://juejin.im/post/5c874d03e51d455aa333e10b

用canvas画一个刮刮卡相关推荐

  1. python程序、画一个笑脸_如何使用canvas画一个微笑的表情(代码示例)

    本篇文章给大家带来的内容是关于如何使用canvas画一个微笑的表情(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 实习期间让我用canvas画一个表情,比较简单,话不多说 ...

  2. [html] 请使用canvas画一个椭圆

    [html] 请使用canvas画一个椭圆 <script> var c=document.getElementById("myCanvas"); var ctx=c. ...

  3. [html] 请使用canvas画一个渐变的长方形

    [html] 请使用canvas画一个渐变的长方形 // 普通canvas绘图工具类// umd适配多种引入方式 (function(root, factory) {if (typeof define ...

  4. 用canvas画一个太极图(八卦图)

    用canvas画一个太极图(八卦图) 源码展示链接: https://yanhappiness.github.io/Notes/canvas_src.html 理解什么是canvas canvas是H ...

  5. 如何利用canvas画一个圆,并且填充颜色

    如何利用canvas画一个圆,并且填充颜色(小白专用,大佬勿看) canvas基础 相信在此之前,你对canvas已经有一定的了解了,接下来我将介绍,如何利用canvas画一个圆. 1.新建一个htm ...

  6. 用canvas画一个五星红旗

    利用canvas画一个好看的五星红旗!!! 简单,容易上手! <!DOCTYPE html> <html lang="utf-8"> <meta ht ...

  7. 用canvas画一个简易的机器猫头像

    用canvas画一个机器猫的头像,原图如下: 代码实现效果如下: 代码如下: <!DOCTYPE html> <html lang="en"> <he ...

  8. 使用H5 canvas画一个坦克

      具体步骤如下: 1. 首先做出绘图区,作为坦克的战场 <canvas id="floor" width="800px" height="50 ...

  9. html5 --- 使用canvas画一个渐变矩形

    我们希望得到如下效果: 首先准备画布 // HTML <canvas width="500" height="375" id ="a" ...

  10. 【css】使用 canvas 画一个圆、贝塞尔曲线画对话气泡

    画一个圆 HTML <canvas id="canvas"></canvas> JavaScript var canvas = document.getEl ...

最新文章

  1. 【神经网络】(7) 迁移学习(CNN-MobileNetV2),案例:乳腺癌二分类
  2. Amazon Redshift 架构
  3. VC++连接Mysql
  4. FLV协议5分钟入门浅析
  5. LeetCode MySQL 1741. 查找每个员工花费的总时间
  6. java五子棋(可悔棋,人人+人机对弈)
  7. 解决thrift: ···No such file or directory问题
  8. 怎样阻止电脑开机自动安装大量垃圾软件
  9. 使用delphi 10.2 开发linux 上的Daemon
  10. 基于Matlab的自适应低通滤波器设计,课程设计-低通滤波器设计(含matlab程序)
  11. 对于三极管饱和状态的理解
  12. AVR PIC单片机视频教程
  13. C语言100ms周期运行时间不够,DEH-系统调研报告.docx
  14. EZStation如何登陆云端账号、密码?
  15. object-c 字符串 c语言字符,Objective-C中字符串的拼接方法小结
  16. 已解决IndentationError: unindent does not match any outer indentation level
  17. 【视线追踪】视线追踪的性能评估框架 及 基础知识
  18. 玩游戏计算机什么比较重要,台式机和笔记本玩游戏-玩游戏电脑三大件哪一个最重要? – 手机爱问...
  19. 微信小程序云函数中的数据处理后返回
  20. 您所需要的已经不是吃饱喝足和睡暖了

热门文章

  1. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_05 IO字符流_5_flush方法和close方法的区别...
  2. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_05 IO字符流_3_字符输出流_Writer类FileWriter类...
  3. Mysql基本语句(个人笔记)
  4. DAG最小可重路径覆盖or最长反链的一种做法
  5. js点击a链接弹出alert对话框
  6. Linux系统各个目录的一般作用
  7. Microsoft SQL Server是如何加密口令的?未公开的加密函数
  8. 关于阿里巴巴发布普惠体的一些思考
  9. Docker概念学习系列之详谈Docker 的核心组件与概念(5)
  10. ustc FreeBSD / rust 镜像源