微信小程序canvas實現(xiàn)刮刮樂效果
本文實例為大家分享了微信小程序?qū)崿F(xiàn)刮刮樂效果的具體代碼,供大家參考,具體內(nèi)容如下
效果圖

設(shè)計流程

設(shè)計思路
- canvas設(shè)置背景圖,作為中獎圖片;
- 在canvas上繪制刮的灰色涂層;
- 通過綁定的事件,清除對應(yīng)區(qū)域的涂層;
- 最后判斷涂層清除區(qū)域是否超過設(shè)置的可見百分比,如果超過則全部涂層清除,否則不清楚。
1、全局常量
獲取用戶傳入的canvas的ID,設(shè)置的canvas的寬高,canvas涂層的顏色,清除當前坐標的半徑和直徑,計算當前清除的面積,全部清除百分比,canvas的面積。
constructor(page,opts){
opts = opts || {};
this.page = page;
this.canvasId = opts.canvasId || 'luck';
this.width = opts.width || 300;
this.height = opts.height || 150;
this.maskColor = opts.maskColor || '#dddddd';
this.size = opts.size || 8;
this.r = this.size * 2;
this.area = this.r * this.r;
this.scale = opts.scale || 0.75;
this.totalArea = this.width * this.height;
this.init();
}
2、初始化全局變量
1、變量:判斷清除全部涂層的布爾值,記錄清除坐標的數(shù)組。
2、API:調(diào)用創(chuàng)建canvas繪圖上下文API。
3、方法:調(diào)用涂層繪制函數(shù),調(diào)用事件綁定函數(shù)。
init(){
this.show = false;
this.clearPoints = [];
this.ctx = wx.createCanvasContext(this.canvasId, this);
this.drawMask();
this.bindTouch();
}
3、涂層繪制函數(shù)的實現(xiàn)
drawMask(){
this.ctx.setFillStyle(this.maskColor);
this.ctx.fillRect(0, 0, this.width, this.height);
this.ctx.draw();
}
4、事件綁定函數(shù)的實現(xiàn)
1 、touchstart事件只是清除當前位置的坐標點半徑的涂層。
2 、touchmove事件清除移動過程個坐標點半徑內(nèi)的涂層。
3 、touchend事件判斷當前次清除是否超過總面積的75%,超過則全部清除,否則不做處理。
bindTouch(){
const _this = this;
_this.page.onTouchStart = function(e){
_this.eraser(e,true);
}
_this.page.onTouchMove = function (e) {
_this.eraser(e);
}
_this.page.onTouchEnd = function (e) {
if(_this.show){
_this.ctx.clearRect(0, 0, _this.width, _this.height);
_this.ctx.draw();
}
}
}
5、eraser橡皮擦函數(shù)的實現(xiàn)
1、獲取記錄清除坐標點數(shù)組的長度,當前位置的x,y坐標,計算清除塊的起點,聲明計數(shù)變量。
2、判斷是否是第一次進入,是則直接記錄該坐標。
3、判斷當前點在記錄數(shù)組中是否存在,如果存在,直接返回,如果不存在,在記錄入數(shù)組。
4、是否滿足清除全部涂層,滿足show賦值為true,不滿足,直接清除當前坐標涂層。
eraser(e,bool){
let len = this.clearPoints.length;
let count = 0
let x = e.touches[0].x, y = e.touches[0].y;
let x1 = x - this.size;
let y1 = y - this.size;
if(bool){
this.clearPoints.push({
x1: x1,
y1: y1,
x2: x1 + this.r,
y2: y1 + this.r
})
}
for (let val of this.clearPoints){
if(val.x1 > x || val.y1 > y || val.x2 < x || val.y2 < y){
count++;
}else{
break;
}
}
if(len === count){
this.clearPoints.push({
x1: x1,
y1: y1,
x2: x1 + this.r,
y2: y1 + this.r
})
}
if (this.clearPoints.length && this.r * this.r * this.clearPoints.length > this.scale * this.totalArea){
this.show = true;
}
this.ctx.clearRect(x1, y1, this.r, this.r);
this.ctx.draw(true);
}
提供的其他實現(xiàn)思路
方法一:本文提供的方法是將中獎圖片作為背景設(shè)置給canvas,然后清除canvas涂層來實現(xiàn)刮刮樂效果。
方法二:canvas繪制涂層,然后取圖片在canvas相同坐標的像素,最后將該處圖片像素繪制到canvas。
方法三:類似方法一,只是將背景直接用圖片img.定位在canvas的下邊。
總結(jié)
最重要的是判斷清除涂層在總canvas面積的占有率記錄,只要判斷該坐標不在清除的范圍,就可以記錄該坐標。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
- 微信小程序?qū)崿F(xiàn)的canvas合成圖片功能示例
- 詳解微信小程序-canvas繪制文字實現(xiàn)自動換行
- 微信小程序使用canvas的畫圖操作示例
- 微信小程序canvas拖拽、截圖組件功能
- 詳解微信小程序canvas圓角矩形的繪制的方法
- 微信小程序canvas寫字板效果及實例
- 微信小程序 二維碼canvas繪制實例詳解
- 微信小程序 wxapp畫布 canvas詳細介紹
- 微信小程序MUI導(dǎo)航欄透明漸變功能示例(通過改變rgba的a值實現(xiàn))
- 微信小程序MUI導(dǎo)航欄透明漸變功能示例(通過改變opacity實現(xiàn))
- 微信小程序基于canvas漸變實現(xiàn)的彩虹效果示例
相關(guān)文章
Extjs顯示從數(shù)據(jù)庫取出時間轉(zhuǎn)換JSON后的出現(xiàn)問題
后臺從數(shù)據(jù)庫取出時間,JSON格式化后再傳到gridpanel,這時時間變成了:/Date(32331121223)/這樣的格式,本文將詳細介紹解決Extjs顯示從數(shù)據(jù)庫取出時間轉(zhuǎn)換JSON后的出現(xiàn)問題2012-11-11
JavaScript操作URL的相關(guān)內(nèi)容集錦
這篇文章主要介紹了JavaScript操作URL的相關(guān)內(nèi)容集錦的相關(guān)資料,需要的朋友可以參考下2015-10-10
js面向?qū)ο蠓庋b級聯(lián)下拉菜單列表的實現(xiàn)步驟
這篇文章主要介紹了js面向?qū)ο蠓庋b級聯(lián)下拉菜單列表的實現(xiàn)步驟,幫助大家更好的理解和使用JavaScript,感興趣的朋友可以了解下2021-02-02
用javascript取得傳遞參數(shù)的個數(shù)的代碼
用javascript取得傳遞參數(shù)的個數(shù)的代碼...2007-10-10
bootstrap日歷插件datetimepicker使用方法
這篇文章主要為大家詳細介紹了bootstrap日歷datetimepicker插件的使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-12-12
深入淺析JavaScript中的arguments對象(強力推薦)
這篇文章主要介紹了JavaScript中的arguments對象(強力推薦)的相關(guān)資料,非常不錯具有參考借鑒價值,需要的朋友可以參考下2016-06-06

