思路=》

 用div来展示刮奖结果,用canvas绘制刮奖前展示的图片或者文字;将canvas叠在div上方,刮奖是只需要操作canvas配合touch事件即可简单完成。

 canvas刮奖可以用globalCompositeOperation属性制作。

 globalCompositeOperation:

属性值 描述
source-over (default) 新图形会覆盖在原有内容之上
destination-over 会在原有内容之下绘制新图形
source-in 新图形会仅仅出现与原有内容重叠的部分。其它区域都变成透明的
destination-in 原有内容中与新图形重叠的部分会被保留,其它区域都变成透明的
source-out 结果是只有新图形中与原有内容不重叠的部分会被绘制出来
destination-out 原有内容中与新图形不重叠的部分会被保留
source-atop 新图形中与原有内容重叠的部分会被绘制,并覆盖于原有内容之上
destination-atop 原有内容中与新内容重叠的部分会被保留,并会在原有内容之下绘制新图形
lighter 两图形中重叠部分作加色处理
darker 两图形中重叠的部分作减色处理
xor 重叠的部分会变成透明
copy 只有新图形会被保留,其它都被清除掉

实现代码

class Scratch{constructor(options){this.obj = document.querySelector(options.obj);    //div容器this.bgPic = options.bgPic;    //刮刮卡前景图this.radius = options.radius;    //圆半径this.area = options.area || 50;    //擦拭部分面积 超过部分隐藏或者清除画布(当前清除画布)this.succuss = options.succuss;    //擦拭成功后执行方法this.startfn = options.startfn; //开始擦拭时调用刮刮乐结果(可以给div换图或者换样式)this.isPrize = false;    //是否擦拭完毕
    }//初始化
    init(){this.getSize();this.createCanvas();this.drawBg();this.event();}//获得容器的宽高(用于设置canvas宽高)
    getSize(){this.width = this.obj.offsetWidth;this.height = this.obj.offsetHeight;this.left = this.obj.offsetLeft;this.top = this.obj.offsetTop;}//创建canvas并设置宽高插入容器中
    createCanvas(){let canvas = document.createElement("canvas");canvas.width = this.width;canvas.height = this.height;this.ctx = canvas.getContext("2d");this.obj.append(canvas)}//绘制前景图 图片必须预加载
    drawBg(){let oImg = new Image(),that = this;oImg.src = that.bgPic;oImg.onload=()=>{this.touch = true;this.ctx.drawImage(oImg,0,0,oImg.width,oImg.height,0,0,this.width,this.height);this.ctx.globalCompositeOperation = 'destination-out';    //设置原有内容中与新图形不重叠的部分会被保留
        }}//添加touch事件
    event(){let obj = this.obj,that = this;obj.addEventListener("touchstart",event=>{that.touchCanvas(event).bind(this)})obj.addEventListener("touchmove",event=>{that.touchCanvas(event).bind(this)})obj.addEventListener("touchend",event=>{})}//擦拭canvas
    touchCanvas(event){if(!this.touch){return false;}if(!this.isPrize){this.isPrize = true;this.startfn();}var e=window.event||event;e.preventDefault();    //禁止ios和安卓默认事件页面下拉动this.clearCanvas(e.targetTouches[0].pageX-this.left,e.targetTouches[0].pageY-this.top);}//绘制圆形 橡皮擦
    clearCanvas(x,y){this.ctx.save();this.ctx.beginPath();this.ctx.arc(x,y,this.radius,0,2*Math.PI);this.ctx.fill();this.ctx.closePath();this.ctx.stroke();this.ctx.restore();this.compute();}//计算透明区域
    compute(){var pixels = this.ctx.getImageData(0,0,this.width,this.height).data;let transPixels = [];for(let i = 0; i < pixels.length; i += 4){// 严格上来说,判断像素点是否透明需要判断该像素点的a值是否等于0,// 为了提高计算效率,这儿设置当a值小于128,也就是半透明状态时就可以了if(pixels[i+3] < 128){transPixels.push(pixels[i+3]);}}let area= (transPixels.length / (pixels.length / 4) * 100).toFixed(2);if(area>this.area){this.touch = false;this.ctx.clearRect(0,0,this.width,this.height);this.ctx.globalCompositeOperation = 'source-over';this.succuss();}}//再来一次(重置)
    reset(){this.isPrize = false;this.drawBg();}
}

View Code

(第一次写博客,有错请见谅)

转载于:https://www.cnblogs.com/sublogs/p/10778487.html

canvas 绘制刮刮卡相关推荐

  1. canvas绘制刮刮卡,超过一定面积显示全图

    说明:栗子转自简书,在他的基础上添加了重置和超过一定面积显示全图,仅做学习使用.(推荐7.2的代码) 1.前端时间做的一个项目需要支持多终端,网页版需要使用html5中canvas画布对象对一组数据进 ...

  2. canvas实践——绘制刮刮卡

    canvas实践--绘制刮刮卡 刮刮卡是一种常见的效果,如下图所示: 上述效果可以通过canvas中图像合成来实现,具体思路和代码如下: 1.利用css将刮刮卡的结果与canvas灰色涂层重叠: ht ...

  3. canvas绘制刮刮卡

    无图不欢,先上图 <!DOCTYPE html> <html> <head><meta name="keywords" content=& ...

  4. canvas入门--绘制刮刮卡

    1.html代码 <div class="jpk" id="jpk"><div class="jp" id="j ...

  5. 刮刮乐html5效果擦除,利用HTML5的画布Canvas实现刮刮卡效果

    先给大家展示效果: 你玩过刮刮卡么?一不小心可以中奖的那种.今天我给大家分享一个基于HTML5技术实现的刮刮卡效果,在PC上只需按住鼠标,在手机上你只需按住指头,轻轻刮去图层就可以模拟真实的刮奖效果. ...

  6. canvas刮刮卡游戏开发

    canvas刮刮卡游戏开发 先看效果: 一.基础知识-画布元素的使用 1 绘制线条 思路 在页面中添加画布元素 获取画布元素的上下文环境对象 使用上下文环境对象绘制图形,保存在内存中 绘制一个线条 / ...

  7. canvas实现刮刮卡

    <canvas id="canvas" width="400" height="100"></canvas> < ...

  8. canvas实现刮刮卡,vue3实现

    效果图: 主要属性:globalCompositeOperation 代码: <template><div class="guaguaka" id="g ...

  9. 用Canvas实现刮刮卡功能的研究与实践

        前几天,单位老刘让我研究一下网上最近很流行的"刮刮卡"是怎么实现的,我第一时间就想起了我媳妇曾经跟我说过的:"在HTML5中Canvas的绘图能力很强大" ...

最新文章

  1. docker 查看已安装容器_docker中的容器安装PHP扩展件
  2. 二维码原理--开胃小知识
  3. C++学习—— mutable和 extern
  4. 谈谈对水晶报表的看法
  5. SicilyBrackets Matching
  6. 刨根问底:对于 self = [super init] 的思考
  7. bio linux 创建_Linux设备驱动--块设备之概念和框架以及相关结构体
  8. Sutherland-Hodgeman多边形裁剪
  9. 一个程序员的爱情和他的小棉袄
  10. Shell编程之常用内置命令
  11. 炎炎夏日送清凉,转发集赞得T恤,51CTO定制T恤免费送了
  12. getValueFromEvent和shouldUpdate
  13. 小白学 Python 爬虫(26):为啥上海二手房你都买不起
  14. [并发并行]_[线程池]_[Programming With POSIX Threads的线程池实现分析1]
  15. 3dsMax是什么?有什么功能、能做些什么?
  16. JIRA 从低版本升级到高版本(3.6.2-6.0.8)
  17. 2019京东618活动提报要求一览
  18. TCP/IP之大明王朝邮差
  19. VC新潮流,Tiger DAO VC以DAO形式入侵
  20. 转载 如何用示波器进行UART串口数据分析

热门文章

  1. Python金融数据挖掘 第7章 复习思考题 3
  2. JQuery基础学习
  3. 客户管理系统 案例分享
  4. 基线_XRD、XPS扣基线教程(基于Originlab)
  5. PLC主要是指数字运算操作电子系统的可编程逻辑控制器
  6. Xutils之BitmapUtils使用
  7. 穿越 [ UFO | 泰坦尼克号 | 巫师 | 祭师 | 宗教 | 梦 ]
  8. 跟小米、特斯拉分“蛋糕”的优必选要IPO
  9. Linux进程间通信:共享内存mmap、xsi和posix
  10. 【golang/redis】redis中大数字自动转换成指数形式的处理