0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

用代碼來實現(xiàn)一下中彩票的快樂

OpenHarmony技術(shù)社區(qū) ? 來源:鴻蒙技術(shù)社區(qū) ? 作者:陳淇 ? 2022-04-21 08:25 ? 次閱讀

“我只是想中個彩票一輩子不用不上班而已,很過分嗎,又不是想要天上的星星”。

前段時間經(jīng)常聽見這句話,但是對于我來說,中彩票的幾率還是太小了,還是老老實實擼代碼吧,用代碼來實現(xiàn)一下中彩票的快樂。

實現(xiàn)步驟

第一步:創(chuàng)建結(jié)構(gòu)

首先根據(jù)實現(xiàn)效果創(chuàng)建相應(yīng)的結(jié)構(gòu),給刮刮樂畫設(shè)置背景圖片,讓它看起來美觀。

實現(xiàn)效果:

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

/*設(shè)置刮獎背景*/
.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;
}

/*開獎區(qū)域樣式*/
.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;
}

完成后實現(xiàn)的效果。

第二步:寫 js 代碼實現(xiàn)上層刮刮樂涂層效果

通過 ctx.fillRect 方法實現(xiàn)矩形區(qū)域的涂層填充,將畫布變?yōu)榛疑?;通過 ctx.font 設(shè)置字體大小。

ctx.fillText 實現(xiàn)涂層上方文字效果,ctx.fillStyle 實現(xiàn)文字顏色設(shè)置。在 onShow 處進行調(diào)用就能實現(xiàn)基礎(chǔ)的涂層效果了。

效果圖如下:

注意:這里在 onInit 處調(diào)用函數(shù)不能成功展示出畫布,在 onShow 時調(diào)用才顯示成功。

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 設(shè)置觸摸事件,實現(xiàn)效果

給 canvas 畫布上綁定觸摸事件,在觸摸時計算觸摸點的位置,以觸摸點的坐標(biāo)為圓心,進行圓形區(qū)域的擦除。

觸摸點坐標(biāo)計算:通過觸摸事件得到一個對象,將對象進行解析會得到對應(yīng)的值,對數(shù)據(jù)進行處理,拿到觸摸點的 X,Y 坐標(biāo)點。

調(diào)用 ctx.arc 方法進行畫圓,選中圓形區(qū)域進行消除。

xxx.hml

ref="canvas"style="width:202px;height:43px;"@touchstart="touchstart"
@touchmove="touchmove"@touchend="touchend"@touchcancel="touchcancel"class="canvas"></canvas>

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
},

第四步:設(shè)置超過一定百分比清除畫布

計算刮過區(qū)域的面積:使用 ctx.getImageData 方法得到整個區(qū)域的圖像信息。

getImageData() 方法返回 ImageData 對象,該對象拷貝了畫布指定矩形的像素數(shù)據(jù)。

對于 ImageData 對象中的每個像素,都存在著四方面的信息,即 RGBA 值:

  • R - 紅色(0-255)

  • G - 綠色(0-255)

  • B - 藍色(0-255)

  • A - alpha 通道(0-255;0 是透明的,255 是完全可見的)

color/alpha 以數(shù)組形式存在,并存儲于 ImageData 對象的data屬性中。

通過判斷像素點的 A 值是否為 0 來判斷已經(jīng)刮過的區(qū)域進行計算,最終將計算出的區(qū)域面積與總面積進行對比來設(shè)置刮除區(qū)域超過多少百分比時進行清除整個區(qū)域。

通過調(diào)用 ctx.clearRect 方法來進行整個區(qū)域的清除。

//計算已經(jīng)刮過的區(qū)域占整個區(qū)域的百分比
getFilledPercentage(){
letimgData=this.ctx.getImageData(0,0,this.mWidth,this.mHeight);
//imgData.data是個數(shù)組,存儲著指定區(qū)域每個像素點的信息,數(shù)組中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)+'%'
},

//設(shè)置閾值,去除灰色涂層
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涂層設(shè)置為透明
//this.ctx.fillStyle='rgba(255,255,255)';
//this.ctx.fillRect(0,0,this.mWidth,this.mHeight)
}
},

源碼地址:

https://gitee.com/chen-qi-7/demo-g

總結(jié)

以上就是制作一個刮刮樂的詳細過程了,最終效果與上面的效果一樣。其實是一個很簡單的功能,利用了 canvas 的一些特性來進行操作,后期還可以給其增加更多的功能,歡迎各位開發(fā)者一起討論與研究,希望本次分享對大家的學(xué)習(xí)有所幫助。

原文標(biāo)題:HarmonyOS基于JSAPI實現(xiàn)刮刮樂效果

文章出處:【微信公眾號:HarmonyOS技術(shù)社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4700

    瀏覽量

    68117
  • HarmonyOS
    +關(guān)注

    關(guān)注

    79

    文章

    1958

    瀏覽量

    29921

原文標(biāo)題:HarmonyOS基于JSAPI實現(xiàn)刮刮樂效果

文章出處:【微信號:gh_834c4b3d87fe,微信公眾號:OpenHarmony技術(shù)社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    求生日快樂的音樂代碼

    想用單片機控制蜂鳴器,使得蜂鳴器演奏生日快樂這首歌,希望能得到生日快樂這首歌的音樂代碼
    發(fā)表于 04-11 19:19

    大家討論一下蟻群算法實現(xiàn)路徑規(guī)劃的硬件實現(xiàn)問題

    本帖最后由 gk320830 于 2015-3-8 06:44 編輯 大家討論一下蟻群算法實現(xiàn)路徑規(guī)劃的硬件實現(xiàn)問題,不僅僅是
    發(fā)表于 04-26 17:19

    請教一下怎么AD5763實現(xiàn)雙極性電壓輸出數(shù)模轉(zhuǎn)換

    我知道款高性能數(shù)模轉(zhuǎn)換器AD5763 ; 想請教一下怎么AD5763實現(xiàn)雙極性電壓輸出數(shù)模轉(zhuǎn)換?
    發(fā)表于 04-07 07:04

    介紹一下波形占空比實現(xiàn)的方式

    先上圖如圖 是我生成的個波形 這個波形的占空比在連續(xù)的四個周期內(nèi)分別是10%,20%,30%,40%, 并且按照這個順序循環(huán)這里大致介紹一下實現(xiàn)的方式。使用的軟件是Cubemx(庫函肯定也可以
    發(fā)表于 08-04 09:25

    如何將紅外通訊代碼轉(zhuǎn)化實現(xiàn)?

    如何將紅外通訊代碼轉(zhuǎn)化實現(xiàn)
    發(fā)表于 10-20 07:26

    iOS中怎樣代碼實現(xiàn)mvvm的記錄

    真的,代碼這個東西光看看不出個花,還是要寫出來才能體會的更深,所以我不講這兩種模式的來龍去脈,我也講不清 ^_^, 要是看過比較多理論上的東西,再結(jié)合一下代碼理理思路還是極好滴。 目的介紹 上面已經(jīng)說了,這是
    發(fā)表于 09-25 11:19 ?0次下載
    iOS中怎樣<b class='flag-5'>用</b><b class='flag-5'>代碼</b><b class='flag-5'>實現(xiàn)</b>mvvm的記錄

    基于區(qū)塊鏈構(gòu)架研發(fā)的國家級底層彩票系統(tǒng)Winchain介紹

    ,用去中心化的思維革新彩票行業(yè),將 Winchain 區(qū)塊鏈彩票發(fā)展成為世界彩票底層系統(tǒng)的標(biāo)準(zhǔn)。目前,非洲某國國家彩票系統(tǒng)已經(jīng)決定采用 Winchain 底層
    發(fā)表于 03-13 10:59 ?5957次閱讀
    基于區(qū)塊鏈構(gòu)架研發(fā)的國家級底層<b class='flag-5'>彩票</b>系統(tǒng)Winchain介紹

    怎樣成為快樂的ASP.NET程序員

    首先我想解釋一下標(biāo)題中兩個關(guān)鍵字: “快樂”, “ASP.NET程序員”。
    的頭像 發(fā)表于 06-11 17:18 ?2403次閱讀

    電磁爐加熱一下就停一下什么原因及解決辦法

    電磁爐有時會出現(xiàn)加熱故障,現(xiàn)象是熱一下一下在熱一下又停一下,基本隔
    發(fā)表于 03-18 09:02 ?27.3w次閱讀

    電磁爐加熱一下就停一下什么原因

    電磁爐加熱一下就停一下什么原因。
    的頭像 發(fā)表于 06-04 10:01 ?3.8w次閱讀

    剖析一下CPU對代碼的識別和讀取

    先說一下半導(dǎo)體,啥叫半導(dǎo)體?就是介于導(dǎo)體和絕緣體中間的種東西,比如二極管。
    的頭像 發(fā)表于 02-13 16:32 ?1233次閱讀

    分享一下Cortex-M裸機環(huán)境臨界區(qū)保護的幾種實現(xiàn)方法

    RTOS有臨界區(qū),裸機依然有臨界區(qū)。今天給大家分享一下Cortex-M裸機環(huán)境臨界區(qū)保護的幾種實現(xiàn)方法。
    發(fā)表于 06-13 09:08 ?650次閱讀
    分享<b class='flag-5'>一下</b>Cortex-M裸機環(huán)境<b class='flag-5'>下</b>臨界區(qū)保護的幾種<b class='flag-5'>實現(xiàn)</b>方法

    彩票機的組網(wǎng)方案介紹

    歡迎來到東知識小課堂彩票機最初的組網(wǎng)構(gòu)思以及使用的設(shè)備在篇早期的文章中我發(fā)現(xiàn)了彩票機最初的組網(wǎng)構(gòu)思——“
    的頭像 發(fā)表于 04-15 09:00 ?2017次閱讀
    <b class='flag-5'>彩票</b>機的組網(wǎng)方案介紹

    盤點一下CST電磁仿真軟件的求解器

    今天我們一起來盤點一下CST電磁仿真軟件那些牛叉的求解器。快來數(shù)一下,你用了里面的幾種吧!
    的頭像 發(fā)表于 11-20 10:18 ?5762次閱讀
    盤點<b class='flag-5'>一下</b>CST電磁仿真軟件的求解器

    浪涌抗擾度怎么測?我們這個A/D轉(zhuǎn)換器試了一下

    浪涌抗擾度怎么測?我們這個A/D轉(zhuǎn)換器試了一下
    的頭像 發(fā)表于 11-27 15:20 ?663次閱讀
    浪涌抗擾度怎么測?我們<b class='flag-5'>用</b>這個A/D轉(zhuǎn)換器試了<b class='flag-5'>一下</b>