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

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

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

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

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

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

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

實(shí)現(xiàn)步驟

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

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

實(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è)置刮獎(jiǎng)背景*/
.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;
}

/*開獎(jiǎng)區(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;
}

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

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

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

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

效果圖如下:

注意:這里在 onInit 處調(diào)用函數(shù)不能成功展示出畫布,在 onShow 時(shí)調(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,終點(diǎn)X,終點(diǎn)Y)
ctx.fillRect(0,0,202,43);

this.ctx.fillStyle='#000';
//繪制填充文字
this.ctx.font="28px";
this.ctx.fillText('刮開有獎(jiǎng)',50,30);
},

第三步:給 canvas 設(shè)置觸摸事件,實(shí)現(xiàn)效果

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

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

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

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)
//去掉中括號(hào),將其變成對(duì)象
letx1=x.replace(/[|]/g,'')
letx2=JSON.parse(x1)
letx3=JSON.stringify(x2)

//計(jì)算觸摸點(diǎn)位置
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è)置超過一定百分比清除畫布

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

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

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

  • R - 紅色(0-255)

  • G - 綠色(0-255)

  • B - 藍(lán)色(0-255)

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

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

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

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

//計(jì)算已經(jīng)刮過的區(qū)域占整個(gè)區(qū)域的百分比
getFilledPercentage(){
letimgData=this.ctx.getImageData(0,0,this.mWidth,this.mHeight);
//imgData.data是個(gè)數(shù)組,存儲(chǔ)著指定區(qū)域每個(gè)像素點(diǎn)的信息,數(shù)組中4個(gè)元素表示一個(gè)像素點(diǎn)的rgba值
letpixels=imgData.data;
lettransPixels=[];
for(leti=0;i4){
//需要判斷像素點(diǎn)是否透明需要判斷該像素點(diǎn)的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é)

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

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

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

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

    關(guān)注

    30

    文章

    4672

    瀏覽量

    67784
  • HarmonyOS
    +關(guān)注

    關(guān)注

    79

    文章

    1947

    瀏覽量

    29747

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

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    求生日快樂的音樂代碼

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    剖析一下CPU對(duì)代碼的識(shí)別和讀取

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

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

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

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

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

    盤點(diǎn)一下CST電磁仿真軟件的求解器

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

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

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