canvas 绘制刮刮卡
思路=》
用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();
}
}
(第一次写博客,有错请见谅)
canvas 绘制刮刮卡的更多相关文章
- canvas实现刮刮卡效果
canvas实现刮刮卡效果 实现步骤: 设置页面背景图,即刮刮卡底部图片 绘制canvas 刮刮卡顶部图片drawImage 绑定事件 addEventListener touchstart.tou ...
- qt qml 刮刮卡效果
用canvas+mouseArea实现的刮刮卡效果. 表层是一层色彩,用手指划开,可看到下面的文字Lisence: MIT, 请保留本文档说明Author: surfsky.cnblogs.com 2 ...
- 网页闯关游戏(riddle webgame)--H5刮刮卡的原理和实践
前言: 之前编写了一个网页闯关游戏(类似Riddle Game), 除了希望大家能够体验一下我的游戏外. 也愿意分享编写这个网页游戏过程中, 学到的一些知识. 对于刮刮卡, 想必大家都很熟悉, 也很喜 ...
- 使用HTML5实现刮刮卡效果
你玩过刮刮卡么?一不小心可以中奖的那种.今天我给大家分享一个基于HTML5技术实现的刮刮卡效果,在PC上只需按住鼠标,在手机上你只需按住指头,轻轻刮去图层就可以模拟真实的刮奖效果. 我们利用HTML5 ...
- Android 自定义View修炼-【2014年最后的分享啦】Android实现自定义刮刮卡效果View
一.简介: 今天是2014年最后一天啦,首先在这里,我祝福大家在新的2015年都一个个的新健康,新收入,新顺利,新如意!!! 上一偏,我介绍了用Xfermode实现自定义圆角和椭圆图片view的博文& ...
- Android刮刮卡自定义控件
网上的都是自己绘制的或者图片,我的需求是可以随意的自定义底部和顶部的布局.所以自己重写一个,原理就是直接继承 View 来实现一个刮层,让这个刮层和图片以及文字不产生任何依赖,再结合 FrameLay ...
- Android 自定义控件实现刮刮卡效果 真的就只是刮刮卡么
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/40162163 , 本文出自:[张鸿洋的博客] 很久以前也过一个html5的刮刮卡 ...
- HTML5_图片合成_刮刮卡
刮刮卡(图片合成) 定义: globalCompositeOperation 属性,设置或返回如何将源图像 将 myCanvas 的背景图设置为一张图片,(刮开后显示) // 目标图像(已有的,外面一 ...
- canvas 实现刮刮乐
在解决问题前,我们先来了解一下 canvas 标签canvas 是 html5 出现的新标签,像所有的 dom 对象一样它有自己本身的属性.方法和事件,其中就有绘图的方法,js 能够调用它来进行绘图. ...
随机推荐
- 基于OpenMP的C++并行编程简单示例
示例要求:在整数A和B之间找到符合条件的值X,使f(X)=C. 示例代码(需要在VS中开启OpenMP支持): #include<iostream> #include<time.h& ...
- EJB JBOSS的安装
下载地址:http://www.jboss.org/jbossas/downloads 下载JBoss 4.2.3-->解压 启动:bin-->run.bat 管理后台:www.local ...
- CVE-2017-17215 - 华为HG532命令注入漏洞分析
前言 前面几天国外有个公司发布了该漏洞的详情.入手的二手 hg532 到货了,分析测试一下. 固件地址:https://ia601506.us.archive.org/22/items/RouterH ...
- web 应用请求乱码问题
背景 作为非西欧语系的国家,总是要处理编码问题 使用java编码解码 @Test public void coderTest() throws UnsupportedEncodingException ...
- 外业数据采集平台(GPS+Android Studio+Arcgis for android 100.2.1)
外业数据采集平台 1. 综述 在室外,通过平板或者手机接收GPS坐标,实时绘制点.线.面数据,以便为后续进行海域监测.土地确权.地图绘图提供有效数据和依据. 2. 技术路线 Android studi ...
- WEB API 支持多种端的后台
一套代码,支持多种平台 1. 支持web 可以js获取webapi的数据源.利用mvvm组织展现在html上. 2.支持安卓. post方法,安卓获取webapi的数据.
- [SQL Server]数据库的恢复
数据库恢复是和数据库备份相对应的操作,它是将数据库备份重新加载到系统中的过程.数据库恢复可以创建备份完成时数据库中存在的相关文件,但是备份以后的所有数据库修改都将丢失. SQL Server进行数据库 ...
- (转)透明光照模型与环境贴图之基础理论篇(折射率、色散、fresnel定律) .
摘抄“GPU Programming And Cg Language Primer 1rd Edition” 中文名“GPU编程与CG语言之阳春白雪下里巴人” 材质和光的交互除了反射现象,对于透明物 ...
- 魅力python------if - else 语句
引入:if-else的作用,满足一个条件做什么,否则做什么. if-else语句语法结构 if 判断条件: 要执行的代码 else: 要执行的代码 判断条件:一般为关系表达式或bool类型的值 执行过 ...
- windows命令行大全
命令简介 cmd是command的缩写.即命令行 . 虽然随着计算机产业的发展,Windows 操作系统的应用越来越广泛,DOS 面临着被淘汰的命运,但是因为它运行安全.稳定,有的用户还在使用,所以一 ...