<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="initial-scale=1.0,user-scalable=no"> <title>canvas beginePath example</title> <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script> </head> <body> <div style="position:relative;"> <div style="width:300px;height:200px;text-align:center;vertical-align:middle;background-color:#fbda61;"> <p style="line-height:200px;color:#FFF;font-size:16px;">谢谢惠顾</p> </div> <canvas id="demo" width="300" height="200" style="position:absolute;top:0;">canvas-unsupported code here</canvas> </div> </body> <script> var canvasEle = document.getElementById("demo"); var ctx = document.getElementById("demo").getContext("2d"); //得到画布 var ctxWidth = canvasEle.offsetWidth; //获取canvasEle的宽度和高度 var ctxHeight = canvasEle.offsetHeight; ctx.beginPath(); ctx.fillStyle ="#d8d8d8"; //填充颜色 ctx.fillRect(0,0,ctxWidth, ctxHeight);//画矩形 ctx.closePath(); ctx.font ="30px Arial"; //字体大小和family ctx.fillStyle ="#A79485"; //字体颜色 ctx.textBaseline = "middle"; //设置字体基线 ctx.textAlign = "center"; //字体水平居中 ctx.fillText("Draw a lottery", ctxWidth/2, ctxHeight/2); var area = ctxWidth * ctxHeight; l = canvasEle.offsetLeft; t = canvasEle.offsetTop; /*绑定触摸屏幕事件*/ var bindEvent = function(){ canvasEle.addEventListener('touchstart',startFunc,false); canvasEle.addEventListener('touchmove', moveFunc, false); canvasEle.addEventListener('touchend', endFunc, false); }; var firstFlag = true; var startFunc = function(){ if(firstFlag){ console.log("首次触屏时发生的函数,可以在这里请求后台拿到奖券的数据"); } }; var moveFunc = function(e){ var touch = e.touches[0], posX = touch.clientX - l, posY = touch.clientY - t; ctx.beginPath(); ctx.arc(posX, posY, 15, 0, Math.PI * 2, 0); ctx.fill(); }; var endFunc = function(){ var data = ctx.getImageData(0, 0, ctxWidth, ctxHeight).data, scrapeNum = 0; for(var i = 3, len = data.length; i < len; i += 4){ if(data[i] === 0){ scrapeNum++; } } if(scrapeNum > area * 0.3){ //刮掉面积大于某个值时 全部清除 ctx.clearRect(0, 0, ctxWidth, ctxHeight); canvasEle.removeEventListener('touchmove', moveFunc, false); canvasEle.removeEventListener('touchend', endFunc, false); } } $(document).ready(function () { ctx.globalCompositeOperation = 'destination-out'; bindEvent(); }); </script> </html>
1.这里值得注意的是 canvas的宽度和高度必须单独写,写在style下是不行的。用offsetWidth,offsetHeight获取宽高度;
2.可以在startFunc里面调用接口 获取奖券的信息;
3.在矩形上绘制文本水平垂直居中,fillText(text,x,y,maxWidth);x,y两个参数是设置相对于画布的x,y坐标,再用textBaseline,textAlign设置居中即可;
4.本文刮刮乐的主要思想是 页面初始化时先用一个div放在canvas的下面,设置好样式,进行隐藏,canvas放在上面;首次触屏时 请求接口 替换奖券数据,当刮掉面积超过某个值时,自动清除所有;
5.浏览器需要在手机模式下才能看到效果。
总之,本文仅供参考,如有不足之处,请指正。
欢迎分享本文,转载请保留出处:前端ABC » canvas实现手机端刮刮乐