刮刮卡
来源:互联网 发布:特价机票全额退款 知乎 编辑:程序博客网 时间:2024/06/05 07:35
实现思路
用canvas画三层,
最下面的一层为奖品图片
中间一层为灰色的刮卡层
最上面一层是用户的滑动范围
利用canvas的destination-out 让相加的部分变透明
//只绘制先绘制图形不相交的部分,由先绘制图形的填充覆盖,其余部分透明,全部浏览器通过
Canvas里的globalCompositeOperation
js代码
class RafflePages extends BaseClass { constructor(str) { super(str); } init() { super.init(); this.ctx = ''; this.canvas = ''; this.img = ''; this.isused = 0; } hide(){ super.hide(); this.$dom.find('#guaguakas').hide(); } show(flag) { super.show(); if(flag){ this.$dom.find('#guaguakas').show(); this.showCard(); this.isused = 0; } // this.num = Math.random();// this.randomPage(); // this.$dom.find('.reset').on('tap',()=>{ // this.reset(); // }) } showCard() { this.img = new Image(); this.canvas = document.querySelector('#guaguakas');// this.canvas.style.backgroundColor = 'transparent';// this.canvas.style.position = 'absolute'; var w = this.$dom.find('.intergation').innerWidth()+1; var h = this.$dom.find('.intergation').innerHeight()+1; this.canvas.width = w; this.canvas.height = h; var self = this; this.img.addEventListener('load', function (e) { var w = self.img.width / 1.75, h = self.img.height / 1.75; var mousedown = false; function layer(ctx) { ctx.drawImage(self.img, 0, 0, self.canvas.width, self.canvas.height) } function eventDown(e) { e.preventDefault(); mousedown = true; } function eventUp(e) { e.preventDefault(); mousedown = false; self.autoClear(); } function eventMove(e) { e.preventDefault(); if (mousedown) { if (e.changedTouches) { e = e.changedTouches[e.changedTouches.length - 1]; } var offsetX = $('#guaguakas').offset().left, offsetY = $('#guaguakas').offset().top; var x = (e.clientX + document.body.scrollLeft || e.pageX) - offsetX || 0, y = (e.clientY + document.body.scrollTop || e.pageY) - offsetY || 0; self.ctx.beginPath(); self.ctx.arc(x, y, 15, 0, Math.PI * 2); self.ctx.fill(); } }// self.canvas.width = self.$dom.find('.scratchBg').width() * 0.9;// self.canvas.height = self.$dom.find('.scratchBg').height() * 0.8; self.ctx = self.canvas.getContext('2d'); self.ctx.clearRect(0, 0, self.canvas.width, self.canvas.height); self.ctx.fillStyle = '#f0f8eb'; self.ctx.fillRect(0, 0, w, h); layer(self.ctx); //destination-out 只绘制先绘制图形不相交的部分,由先绘制图形的填充覆盖,其余部分透明,全部浏览器通过 self.ctx.globalCompositeOperation = 'destination-out'; self.canvas.addEventListener('touchstart', eventDown); self.canvas.addEventListener('touchend', eventUp); self.canvas.addEventListener('touchmove', eventMove); }); if(localStorage.getItem('share')){ self.img.src = 'resources/img/intergation6.png'; }else{ self.img.src = 'resources/img/intergation7.png'; }// self.img.src = 'resources/img/intergation6.png'; } autoClear() { var self = this; if(self.isused==0){ self.showPage(); self.isused=1; } //当剩余未刮开的小于X%时自动刮开余下的部分 var data = this.ctx.getImageData(0, 0, this.canvas.width, this.canvas.height).data; for (var i = 0, j = 0; i < data.length; i += 4) { if (data[i] && data[i + 1] && data[i + 2] && data[i + 3]) { j++; } } if (j <= this.canvas.width * this.canvas.height * 0.4) { self.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);// setTimeout(function () {// self.showPage();// }, 500); self.$dom.find('#guaguakas').hide(); return; } } reset() { this.ctx.globalCompositeOperation = 'source-over'; this.ctx.drawImage(this.img, 0, 0, this.canvas.width, this.canvas.height); this.ctx.globalCompositeOperation = 'destination-out'; } randomPage() {// var self = this;// $.ajax({// url: `${Config.server}/lottery/${Config.visitor.openId}`,// type: 'GET',// success: function (res) {// if (res.code != 0) {// return;// }// if (res.data.status == 0) {// self.$dom.find('.unluckContainer').show();// } else if (res.data.status == 1) {// self.$dom.find('.luckContainer').show();// }// // //console.log(res.data);//0未中奖,1中奖,// Config.visitor.isLucky = res.data.status;// }// }) } showPage() { var self = this;// this.$dom.find('#guaguakas').hide(); $.ajax({ url: config.server + `/lottery/${currentMacket.drawnInfo.id}/${config.userInfo.openid}`, type: 'PUT', data: {id:currentMacket.drawnInfo.id,openid:config.userInfo.openid}, success: function(res){ self.isused=1; }, error: function(error){ }//error结束 }); }}module.exports = RafflePages;
html
<canvas id="guaguakas" class="canvas2" ></canvas>
阅读全文
0 0
- 刮刮卡
- 刮刮卡
- Canvas 刮刮卡
- Android 刮刮卡
- 绘制刮刮卡
- 刮刮卡案例
- 刮刮卡效果
- 刮刮卡效果
- canvas刮刮卡
- Android 刮刮卡
- 刮刮卡效果
- 自定义刮刮卡
- html5实现刮刮卡效果
- html5实现刮刮卡
- flash刮刮卡效果实现
- Android刮刮卡效果
- Android刮刮卡效果
- HTML5实现刮刮卡功能
- Android音视频-视频采集(系统API预览)
- 【Person Re-ID】常用评测指标
- MyBatis:SQL语句中的foreach的详细介绍
- Java面试学习总结(1)
- Python 小技巧:for 循环后面接 else 语句
- 刮刮卡
- 最优化问题——梯度下降/上升法
- Sublime Text3 3143 注册码,亲测可用!
- HDU4812 D tree 【点分治 + 乘法逆元】
- 商业模式是决定项目成败的关键
- Block 概要
- Android手机卡顿原因
- vue 通过下拉框组件了解Vue中父子组件通讯
- 自定义View圆角ImageView