“我只是想中個彩票一輩子不用不上班而已,很過分嗎,又不是想要天上的星星”。
前段時間經常聽見這句話,但是對于我來說,中彩票的幾率還是太小了,還是老老實實擼代碼吧,用代碼來實現一下中彩票的快樂。
實現步驟
第一步:創建結構
首先根據實現效果創建相應的結構,給刮刮樂畫設置背景圖片,讓它看起來美觀。
實現效果:
hml 代碼:
xxx.hml
<divclass="container">
<divclass="card">
<divclass="prize-box">
<textclass="text">
{{prize}}
text>
<canvasref="canvas"style="width:202px;height:43px;"@touchstart="touchstart"
@touchmove="touchmove"@touchend="touchend"@touchcancel="touchcancel"class="canvas">canvas>
div>
div>
div>
css 代碼部分:
.container{
flex-direction:column;
justify-content:center;
align-items:center;
width:100%;
height:100%;
background-color:#284243;
font-family:sans-serif;
}
/*設置刮獎背景*/
.card{
width:300px;
height:300px;
background-image:url(/common/images/guaguale.png);
background-size:cover;
justify-content:space-around;
align-items:center;
flex-direction:column;
}
.prize-box{
margin-left:5%;
margin-top:33%;
width:202px;
}
/*開獎區域樣式*/
.text{
text-align:center;
position:absolute;
width:202px;
height:43px;
background-color:#fff;
z-index:1;
font-size:18px;
font-weight:600;
}
/*刮刮樂涂層*/
.canvas{
z-index:2;
}
完成后實現的效果。
第二步:寫 js 代碼實現上層刮刮樂涂層效果
通過 ctx.fillRect 方法實現矩形區域的涂層填充,將畫布變為灰色;通過 ctx.font 設置字體大小。
ctx.fillText 實現涂層上方文字效果,ctx.fillStyle 實現文字顏色設置。在 onShow 處進行調用就能實現基礎的涂層效果了。
效果圖如下:
注意:這里在 onInit 處調用函數不能成功展示出畫布,在 onShow 時調用才顯示成功。
xxx.js
onShow(){
this.draw();
},
draw(){
varel=this.$refs.canvas;
varctx=el.getContext('2d',{antialias:true});
this.el=el
this.ctx=ctx
//填充的顏色
ctx.fillStyle='gray';
//填充矩形fillRect(起始X,起始Y,終點X,終點Y)
ctx.fillRect(0,0,202,43);
this.ctx.fillStyle='#000';
//繪制填充文字
this.ctx.font="28px";
this.ctx.fillText('刮開有獎',50,30);
},
第三步:給 canvas 設置觸摸事件,實現效果
給 canvas 畫布上綁定觸摸事件,在觸摸時計算觸摸點的位置,以觸摸點的坐標為圓心,進行圓形區域的擦除。
觸摸點坐標計算:通過觸摸事件得到一個對象,將對象進行解析會得到對應的值,對數據進行處理,拿到觸摸點的 X,Y 坐標點。
調用 ctx.arc 方法進行畫圓,選中圓形區域進行消除。
xxx.hml
xxx.js
touchstart(){
this.isDraw=true;
},
touchmove(e){
letx=JSON.stringify(e.touches)
//去掉中括號,將其變成對象
letx1=x.replace(/[|]/g,'')
letx2=JSON.parse(x1)
letx3=JSON.stringify(x2)
//計算觸摸點位置
letX1=parseInt(JSON.parse(x3).localX)
letY1=parseInt(JSON.parse(x3).localY)
this.ctx.globalCompositeOperation='destination-out';
//畫圓
this.ctx.arc(X1,Y1,10,0,2*Math.PI);
console.log('6666666')
//填充圓形
this.ctx.fill();
},
touchend(){
this.isDraw=false;
},
touchcancel(){
this.isDraw=false
},
第四步:設置超過一定百分比清除畫布
計算刮過區域的面積:使用 ctx.getImageData 方法得到整個區域的圖像信息。
getImageData() 方法返回 ImageData 對象,該對象拷貝了畫布指定矩形的像素數據。
對于 ImageData 對象中的每個像素,都存在著四方面的信息,即 RGBA 值:
-
R - 紅色(0-255)
-
G - 綠色(0-255)
-
B - 藍色(0-255)
-
A - alpha 通道(0-255;0 是透明的,255 是完全可見的)
color/alpha 以數組形式存在,并存儲于 ImageData 對象的data屬性中。
通過判斷像素點的 A 值是否為 0 來判斷已經刮過的區域進行計算,最終將計算出的區域面積與總面積進行對比來設置刮除區域超過多少百分比時進行清除整個區域。
通過調用 ctx.clearRect 方法來進行整個區域的清除。
//計算已經刮過的區域占整個區域的百分比
getFilledPercentage(){
letimgData=this.ctx.getImageData(0,0,this.mWidth,this.mHeight);
//imgData.data是個數組,存儲著指定區域每個像素點的信息,數組中4個元素表示一個像素點的rgba值
letpixels=imgData.data;
lettransPixels=[];
for(leti=0;i4){
//需要判斷像素點是否透明需要判斷該像素點的a值是否為0
if(pixels[i+3]==0){
transPixels.push(pixels[i+3])
}
}
return(transPixels.length/(pixels.length/4)*100).toFixed(2)+'%'
},
//設置閾值,去除灰色涂層
handleFilledPercentage(percentage){
percentage=percentage||0;
console.log('percentage='+percentage)
if(parseInt(percentage)>50){
//去除畫布方法一:直接將canvas涂層清除
this.ctx.clearRect(0,0,this.mWidth,this.mHeight)
console.log('清除畫布')
//方法2:將canvas涂層設置為透明
//this.ctx.fillStyle='rgba(255,255,255)';
//this.ctx.fillRect(0,0,this.mWidth,this.mHeight)
}
},
源碼地址:
https://gitee.com/chen-qi-7/demo-g
總結
以上就是制作一個刮刮樂的詳細過程了,最終效果與上面的效果一樣。其實是一個很簡單的功能,利用了 canvas 的一些特性來進行操作,后期還可以給其增加更多的功能,歡迎各位開發者一起討論與研究,希望本次分享對大家的學習有所幫助。
-
代碼
+關注
關注
30文章
4786瀏覽量
68556 -
HarmonyOS
+關注
關注
79文章
1974瀏覽量
30165
原文標題:HarmonyOS基于JSAPI實現刮刮樂效果
文章出處:【微信號:gh_834c4b3d87fe,微信公眾號:OpenHarmony技術社區】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論