0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

用代码来实现一下中彩票的快乐

OpenHarmony技术社区 来源:鸿蒙技术社区 作者:陈淇 2022-04-21 08:25 次阅读

“我只是想中个彩票一辈子不用不上班而已,很过分吗,又不是想要天上的星星”。

前段时间经常听见这句话,但是对于我来说,中彩票的几率还是太小了,还是老老实实撸代码吧,用代码来实现一下中彩票的快乐。

实现步骤

第一步:创建结构

首先根据实现效果创建相应的结构,给刮刮乐画设置背景图片,让它看起来美观。

实现效果:

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

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

第四步:设置超过一定百分比清除画布

计算刮过区域的面积:使用 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 的一些特性来进行操作,后期还可以给其增加更多的功能,欢迎各位开发者一起讨论与研究,希望本次分享对大家的学习有所帮助。

原文标题:HarmonyOS基于JSAPI实现刮刮乐效果

文章出处:【微信公众号:HarmonyOS技术社区】欢迎添加关注!文章转载请注明出处。

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 代码
    +关注

    关注

    30

    文章

    4554

    浏览量

    66730
  • HarmonyOS
    +关注

    关注

    79

    文章

    1806

    浏览量

    29254

原文标题:HarmonyOS基于JSAPI实现刮刮乐效果

文章出处:【微信号:gh_834c4b3d87fe,微信公众号:OpenHarmony技术社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    代码个随机彩票

    编程语言代码
    小凡
    发布于 :2022年09月14日 05:39:34

    求生日快乐的音乐代码

    想用单片机控制蜂鸣器,使得蜂鸣器演奏生日快乐这首歌,希望能得到生日快乐这首歌的音乐代码
    发表于 04-11 19:19

    大家讨论一下蚁群算法实现路径规划的硬件实现问题

    本帖最后由 gk320830 于 2015-3-8 06:44 编辑 大家讨论一下蚁群算法实现路径规划的硬件实现问题,不仅仅是
    发表于 04-26 17:19

    新人报道-快乐就到

    呵呵呵 快乐开心一下吧{:12:}
    发表于 08-21 14:41

    帮忙改一下MATLAB的代码

    有好心的大神有空可以帮忙改一下MATLAB的代码吗?在线急求啊!
    发表于 05-19 23:04

    份基于LABVEW 的彩票选号器的设计

    份基于LABVEW 的彩票选号器的设计
    发表于 06-09 12:50

    相关性彩色图表示的程序 谁能帮助一下

    `相关性彩色图表示的程序 谁能帮助一下 `
    发表于 10-23 10:23

    请教一下怎么AD5763实现双极性电压输出数模转换

    我知道款高性能数模转换器AD5763 ; 想请教一下怎么AD5763实现双极性电压输出数模转换?
    发表于 04-07 07:04

    介绍一下波形占空比实现的方式

    先上图如图 是我生成的个波形 这个波形的占空比在连续的四个周期内分别是10%,20%,30%,40%, 并且按照这个顺序循环这里大致介绍一下实现的方式。使用的软件是Cubemx(库函肯定也可以
    发表于 08-04 09:25

    请问一下C语言单片机编程为什么总是无符号的数据类型定义?

    请问一下C语言单片机编程为什么总是无符号的数据类型定义?
    发表于 10-14 07:55

    请问一下C语言如何通过移位实现算术乘除?

    请问一下C语言如何通过移位实现算术乘除?
    发表于 10-19 06:48

    如何将红外通讯代码转化实现

    如何将红外通讯代码转化实现
    发表于 10-20 07:26

    总结一下单片机做项目时代码的架构

    总结一下单片机做项目时代码的架构
    发表于 02-24 07:21

    基于区块链构架研发的国家级底层彩票系统Winchain介绍

    Winchain是由新加坡 Winchain Open Source Technology Foundation团队基于区块链构架研发的国家级底层彩票系统。团队凭借卓越的区块链技术及领先的行业资源
    发表于 03-13 10:59 5572次阅读
    基于区块链构架研发的国家级底层<b class='flag-5'>彩票</b>系统Winchain介绍

    彩票机的组网方案介绍

    欢迎来到东用知识小课堂一、彩票机最初的组网构思以及使用的设备在一篇早期的文章中我发现了彩票机最初的组网构思——“彩票发行公司发现,如果在销售额较高的彩票销售点实行多点销售,可以减少排队
    的头像 发表于 04-15 09:00 1251次阅读
    <b class='flag-5'>彩票</b>机的组网方案介绍