欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

微信小程序canvas實(shí)現(xiàn)刮刮樂效果

 更新時(shí)間:2018年07月09日 14:52:55   作者:Rattenking  
這篇文章主要為大家詳細(xì)介紹了微信小程序canvas實(shí)現(xiàn)刮刮樂效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

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

效果圖

這里寫圖片描述

設(shè)計(jì)流程

這里寫圖片描述

設(shè)計(jì)思路

  1. canvas設(shè)置背景圖,作為中獎(jiǎng)圖片;
  2. 在canvas上繪制刮的灰色涂層;
  3. 通過綁定的事件,清除對(duì)應(yīng)區(qū)域的涂層;
  4. 最后判斷涂層清除區(qū)域是否超過設(shè)置的可見百分比,如果超過則全部涂層清除,否則不清楚。

1、全局常量

獲取用戶傳入的canvas的ID,設(shè)置的canvas的寬高,canvas涂層的顏色,清除當(dāng)前坐標(biāo)的半徑和直徑,計(jì)算當(dāng)前清除的面積,全部清除百分比,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、變量:判斷清除全部涂層的布爾值,記錄清除坐標(biāo)的數(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ù)的實(shí)現(xiàn)

drawMask(){
 this.ctx.setFillStyle(this.maskColor);
 this.ctx.fillRect(0, 0, this.width, this.height);
 this.ctx.draw();
}

4、事件綁定函數(shù)的實(shí)現(xiàn)

1 、touchstart事件只是清除當(dāng)前位置的坐標(biāo)點(diǎn)半徑的涂層。
2 、touchmove事件清除移動(dòng)過程個(gè)坐標(biāo)點(diǎn)半徑內(nèi)的涂層。
3 、touchend事件判斷當(dāng)前次清除是否超過總面積的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ù)的實(shí)現(xiàn)

1、獲取記錄清除坐標(biāo)點(diǎn)數(shù)組的長(zhǎng)度,當(dāng)前位置的x,y坐標(biāo),計(jì)算清除塊的起點(diǎn),聲明計(jì)數(shù)變量。
2、判斷是否是第一次進(jìn)入,是則直接記錄該坐標(biāo)。
3、判斷當(dāng)前點(diǎn)在記錄數(shù)組中是否存在,如果存在,直接返回,如果不存在,在記錄入數(shù)組。
4、是否滿足清除全部涂層,滿足show賦值為true,不滿足,直接清除當(dāng)前坐標(biāo)涂層。

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);
 }

提供的其他實(shí)現(xiàn)思路

方法一:本文提供的方法是將中獎(jiǎng)圖片作為背景設(shè)置給canvas,然后清除canvas涂層來(lái)實(shí)現(xiàn)刮刮樂效果。
方法二:canvas繪制涂層,然后取圖片在canvas相同坐標(biāo)的像素,最后將該處圖片像素繪制到canvas。
方法三:類似方法一,只是將背景直接用圖片img.定位在canvas的下邊。

總結(jié)

最重要的是判斷清除涂層在總canvas面積的占有率記錄,只要判斷該坐標(biāo)不在清除的范圍,就可以記錄該坐標(biāo)。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 小程序視頻或音頻自定義可拖拽進(jìn)度條的示例代碼

    小程序視頻或音頻自定義可拖拽進(jìn)度條的示例代碼

    這篇文章主要介紹了小程序視頻或音頻自定義可拖拽進(jìn)度條的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧
    2018-09-09
  • js實(shí)現(xiàn)瀏覽器窗口大小被改變時(shí)觸發(fā)事件的方法

    js實(shí)現(xiàn)瀏覽器窗口大小被改變時(shí)觸發(fā)事件的方法

    這篇文章主要介紹了js實(shí)現(xiàn)瀏覽器窗口大小被改變時(shí)觸發(fā)事件的方法,實(shí)例分析了window.onresize方法的使用技巧,需要的朋友可以參考下
    2015-02-02
  • 微信小程序的線程架構(gòu)【推薦】

    微信小程序的線程架構(gòu)【推薦】

    這篇文章主要介紹了微信小程序的線程架構(gòu),每個(gè)小程序包含一個(gè)描述整體程序的app實(shí)例和多個(gè)描述頁(yè)面的page,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下
    2019-05-05
  • JavaScript實(shí)現(xiàn)拖拽和縮放效果

    JavaScript實(shí)現(xiàn)拖拽和縮放效果

    這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)拖拽和縮放效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • 原生js添加節(jié)點(diǎn)appendChild、insertBefore方式

    原生js添加節(jié)點(diǎn)appendChild、insertBefore方式

    這篇文章主要介紹了原生js添加節(jié)點(diǎn)appendChild、insertBefore方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • Electron 結(jié)合 Selenium + chromedriver 驅(qū)動(dòng)服務(wù)實(shí)現(xiàn)瀏覽器多開思路詳解

    Electron 結(jié)合 Selenium + chromedriver 

    這篇文章主要介紹了Electron 結(jié)合 Selenium + chromedriver 驅(qū)動(dòng)服務(wù)實(shí)現(xiàn)瀏覽器多開思路詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2024-07-07
  • layui清空,重置表單數(shù)據(jù)的實(shí)例

    layui清空,重置表單數(shù)據(jù)的實(shí)例

    今天小編就為大家分享一篇layui清空,重置表單數(shù)據(jù)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧
    2019-09-09
  • three.js利用卷積法如何實(shí)現(xiàn)物體描邊效果

    three.js利用卷積法如何實(shí)現(xiàn)物體描邊效果

    這篇文章主要給大家介紹了關(guān)于three.js利用卷積法如何實(shí)現(xiàn)物體描邊效果的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用three.js具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • 用js生成a標(biāo)簽下載文件并攜帶請(qǐng)求頭的兩種方法

    用js生成a標(biāo)簽下載文件并攜帶請(qǐng)求頭的兩種方法

    這篇文章主要給大家介紹了關(guān)于用js生成a標(biāo)簽下載文件并攜帶請(qǐng)求頭的兩種方法, 這種下載文件方式在前端項(xiàng)目中非常常見,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-03-03
  • 關(guān)于document.cookie的使用javascript

    關(guān)于document.cookie的使用javascript

    構(gòu)造通用的cookie處理函數(shù) cookie的處理過程比較復(fù)雜,并具有一定的相似性。因此可以定義幾個(gè)函數(shù)來(lái)完成cookie的通用操作,從而實(shí)現(xiàn)代碼的復(fù)用。
    2010-10-10

最新評(píng)論