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

描述

   

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

     

 

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

 

实现步骤

   

 

第一步:创建结构

 

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

 

实现效果:

 

hml 代码:

xxx.hml

<div class="container" >
    <div class="card">
        <div class="prize-box">

            <text class="text">
                {{ prize }}
            text>

            <canvas ref="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;
    width100%;
    height100%;
    background-color:#284243 ;
    font-family: sans-serif;
}

/*设置刮奖背景*/
.card{
    width:300px;
    height:300px;
    background-imageurl(/common/images/guaguale.png);
    background-size: cover;
    justify-content: space-around;
    align-items: center;
    flex-direction: column;
}


.prize-box{
    margin-left5%;
    margin-top33%;
    width:202px;
}

/*开奖区域样式*/
.text{
    text-align: center;
    position: absolute;
    width:202px;
    height:43px;
    background-color#fff;
    z-index1;
    font-size18px;
    font-weight:600;
}

/*刮刮乐涂层*/
.canvas{
    z-index2;
}

 

完成后实现的效果。

 

第二步:写 js 代码实现上层刮刮乐涂层效果

 

通过 ctx.fillRect 方法实现矩形区域的涂层填充,将画布变为灰色;通过 ctx.font 设置字体大小。

 

ctx.fillText 实现涂层上方文字效果,ctx.fillStyle 实现文字颜色设置。在 onShow 处进行调用就能实现基础的涂层效果了。

 

效果图如下:

 

注意:这里在 onInit 处调用函数不能成功展示出画布,在 onShow 时调用才显示成功。

xxx.js

        onShow(){
        this.draw();
    },
    draw(){
        var el = this.$refs.canvas;
        var ctx = el.getContext('2d',{ antialias: true });
        this.el = el
        this.ctx = ctx

        //填充的颜色
        ctx.fillStyle = 'gray';
        //填充矩形  fillRect(起始X,起始Y,终点X,终点Y)
        ctx.fillRect(0020243);

        this.ctx.fillStyle = '#000';
        //绘制填充文字
        this.ctx.font = "28px";
        this.ctx.fillText('刮开有奖'5030);
    },

 

第三步:给 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) {
        let x = JSON.stringify(e.touches)
        //去掉中括号,将其变成对象
        let x1 = x.replace(/[|]/g,'')
        let x2 = JSON.parse(x1)
        let x3 = JSON.stringify(x2)

        //计算触摸点位置
        let X1 = parseInt(JSON.parse(x3).localX)
        let Y1 = parseInt(JSON.parse(x3).localY)
        this.ctx.globalCompositeOperation = 'destination-out';

        //画圆
        this.ctx.arc(X1, Y1, 1002 * 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(){
        let imgData = this.ctx.getImageData(0,0,this.mWidth,this.mHeight);
        //imgData.data是个数组,存储着指定区域每个像素点的信息,数组中4个元素表示一个像素点的rgba值
        let pixels = imgData.data;
        let transPixels = [];
        for(let i=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技术社区】欢迎添加关注!文章转载请注明出处。

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

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分