博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
刮刮卡demo-canvas实践
阅读量:6910 次
发布时间:2019-06-27

本文共 2410 字,大约阅读时间需要 8 分钟。

1、利用css将<li><canvas>层重叠;

  • html
	
复制代码
  • css
复制代码
  1. 在canvas画布上绘制刮刮卡图层图像;
var canvas = document.querySelector("canvas");canvas.width = document.documentElement.clientWidth;canvas.height = document.documentElement.clientHeight;if(canvas.getContext){  var ctx = canvas.getContext("2d")  var img = new Image()  img.src = "img/a.png"  img.onload = function(){    draw()}function draw(){  var flag = 0  //用于后面统计刮开百分比  ctx.drawImage(img,0,0,canvas.width,canvas.height)}复制代码

3、在canvas画布区域监听鼠标事件或触摸事件;

// 监听鼠标和touch事件canvas.addEventListener('mousedown', moveStart, false);canvas.addEventListener('touchstart', moveStart, false);canvas.addEventListener('mousemove', move, false);canvas.addEventListener('touchmove', move, false);canvas.addEventListener('mouseup', moveEnd, false);canvas.addEventListener('touchend', moveEnd, false);复制代码

4、在手指移动过程中,实时计算手指在画布中的位置以及移动路径,利用canvas的globalCompositeOperation方法中的destination-out效果将刮过的地方设置为透明从而实现刮卡的效果;

canvas.addEventListener("touchstart",function(ev){    ev = ev||event;    var touchC = ev.changedTouches[0];						    var x = touchC.clientX - canvas.offsetLeft;    var y = touchC.clientY - canvas.offsetTop;    //画线,解决快速画圆bug					    ctx.lineWidth = 40    ctx.lineCap = "round"    ctx.lineJoin = "round"    ctx.globalCompositeOperation="destination-out";    ctx.save();    ctx.beginPath();    ctx.moveTo(x,y)    ctx.lineTo(x+1,y+1)    ctx.stroke()    ctx.restore()})canvas.addEventListener("touchmove",function(ev){    ev = ev||event;    var touchC = ev.changedTouches[0];						    var x = touchC.clientX - canvas.offsetLeft;    var y = touchC.clientY - canvas.offsetTop;						    ctx.save();    ctx.lineTo(x,y)    ctx.stroke()    ctx.restore()})复制代码

5、设置当canvas涂层被刮到一定百分比时去除整个涂层;

  • 利用canvas的getImageData可以获取指定范围区域的每个像素点的rgba的信息,其中a指的是透明度,当a为0时,该像素点完全透明,当a为255时,表示该像素点完全不透明;
  • 通过遍历指定区域的像素点信息,得到透明像素点的个数
    • 透明像素点的个数/总像素点的个数=刮开区域所占百分比
    • 通过设置阈值,使得当所刮区域占比满足一定值时,刮开整个canvas涂层;
canvas.addEventListener("touchend",function(){    var imgData = ctx.getImageData(0,0,canvas.width,canvas.height)    var allPx = imgData.width*imgData.height    for(var i = 0;i
=allPx/2){ canvas.style.opacity = 0 }}) 复制代码

6、全部刮开以后,删canvas层

canvas.addEventListener("transitionend",function(){    this.remove()  //自杀,删除canvas})复制代码

完整代码:

			
复制代码

转载地址:http://olbcl.baihongyu.com/

你可能感兴趣的文章
开发HBase的时候需要搭建的Eclipse总结
查看>>
Mysql数据库修复
查看>>
我的友情链接
查看>>
leetCode 70. Climbing Stairs | 动态规划
查看>>
bboss标签使用大全-数据展示标签
查看>>
java中hashCode()与equals()详解
查看>>
点滴积累【JS】---JS小功能(createElement和insertBefore添加div下面的节点)
查看>>
异步提交form表单
查看>>
A Newbie’s Install of Keras & Tensorflow on Windows 10 with R
查看>>
关于使用input type=file 标签上传文件的注意细节(上传文件 无法获取文件 问题)...
查看>>
<if test="outState!=null">OUT_STATE=#{outState},</if>空格问题
查看>>
.Net内存回收
查看>>
js 获取/设置文本输入域内光标的位置的方法
查看>>
oracle sql developer 出现 : 适配器无法建立连接问题解决方案 The Network Adapter could not establish the connection...
查看>>
Linux下connect超时处理【总结】
查看>>
高性能数据库集群:读写分离
查看>>
Laravel 5.5 Blade::if 简介
查看>>
centos7搭建ELK Cluster集群日志分析平台(三):Kibana
查看>>
UITextField 监听内容变更解决方案
查看>>
详解jar命令打包生成双击即可运行的Java程序
查看>>