• canvas刮奖效果


    上次写刮奖效果都一年前了,那时候还是百度找的源码给改的,自己其实也是迷迷糊糊的,这次因为让妹子写,然后想着自己也重新整理下。

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
        <title>刮奖效果</title>
        <style type="text/css">
        #canvas{
            display: block;
            margin:0 auto;
        }
        </style>
    </head>
    <body>
        <canvas id="canvas"></canvas>
    
        <script type="text/javascript">
        // 初始化,设置canva的宽(width)、高(height),涂抹画笔的直径(r),背景图片(img)(即底层的图片),上层遮罩层
        var width=440;
        var height=440;
        var r=20;
        var img = new Image();
        img.src="1.jpg";
        var canvas=document.getElementById("canvas");
        canvas.style.backgroundImage='url('+img.src+')';
        canvas.width=width;
        canvas.height=height;
        var ctx=canvas.getContext("2d");
        ctx.fillStyle="#ccc";
        ctx.fillRect(0,0,width,height);                    //绘制上层的涂层
        ctx.globalCompositeOperation="destination-out";    //在源图像外显示目标图像。只有源图像外的目标图像部分会被显示,源图像是透明的。
        var isMove=false;
    
        var el=new Array();
        el.x=canvas.offsetLeft;
        el.y=canvas.offsetTop;
        /************************************
        方式一:利用arc来模拟两端圆角的直线
        ***********************************/
        //按下时
        function touchStart(e){
            e.preventDefault();
            isMove=true;
            ctx.closePath();
        }
        // 移动时
        function touchMove(e){
            e.preventDefault();
            var x,y;
            if(isMove){
                if(e.targetTouches){                    //移动端
                    var touch=e.targetTouches[0];
                    x=touch.clientX-el.x;                //坐标矫正
                    y=touch.clientY-el.y;
                }else{                                    //pc端
                    x=e.pageX-el.x;
                    y=e.pageY-el.y;
                }
                ctx.beginPath();
                ctx.arc(x,y,r,0,Math.PI*2);                //绘制笔触
                ctx.fill();
                ctx.closePath();                        //每次闭合路径
            }
        }
        // 离开时
        function touchEnd(e){
            e.preventDefault();
            isMove=false ;
            ctx.closePath();
            //涂抹区域百分比
            var imgData=ctx.getImageData(0,0,width,height);//返回ImageData对象,该对象拷贝画布指定的像素数据
            var pixles=imgData.data;
            var transNum=0;
            //rgba以数组形式储存在imageData中,
            // r=imgData.data[0];
            // g=imgData.data[1];
            // b=imgData.data[2];
            // a=imgData.data[3];
            for(var i=3,j=pixles.length;i<j;i+=4){
                var a=pixles[i];
                if(a==0){
                    transNum++
                }
            }
            var transPercent=transNum/(pixles.length/4);//透明度比
            console.log(transPercent);
            //超过某个值显示所有
            if(transPercent>0.5){
                ctx.fillRect(0,0,width,height);
            }
        }
    
        /**************************************************************************
        方式二:ctx.lineTo(x,y)来画直线,用ctx.lineCap="round";来设置直线两端的圆角
        当滑的很快的时候,这种效果比第一种好
        ***************************************************************************/
        //按下时
        // function touchStart(e){
        //     e.preventDefault();
        //     isMove=true;
        //     var x,y;
        //     if(e.targetTouches){                    //移动端
        //         var touch=e.targetTouches[0];
        //         x=touch.clientX-el.x;
        //         y=touch.clientY-el.y;
        //     }else{                                    //pc端
        //         x=touch.clientX-el.x;
        //         y=touch.clientY-el.y;
        //     }
        //     ctx.beginPath();
        //     ctx.lineCap="round";
        //     ctx.lineJoin="round";
        //     ctx.lineWidth=r;
        //     ctx.moveTo(x,y);
    
        // }
        // // 移动时
        // function touchMove(e){
        //     e.preventDefault();
        //     var x,y;
        //     if(isMove){
        //         if(e.targetTouches){                    //移动端
        //             var touch=e.targetTouches[0];
        //             x=touch.clientX;
        //             y=touch.clientY;
        //         }else{                                    //pc端
        //             x=e.pageX;
        //             y=e.pageY;
        //         }
        //         ctx.lineTo(x,y);                        //绘制笔触
        //         ctx.stroke();
        //     }
        // }
        // // 离开时
        // function touchEnd(e){
        //     e.preventDefault();
        //     isMove=false ;
        //     ctx.closePath();
        // }
    
        // 事件监听
        canvas.addEventListener("touchstart",touchStart);
        canvas.addEventListener("mousedown",touchStart);
        canvas.addEventListener("touchmove",touchMove);
        canvas.addEventListener("mousemove",touchMove);
        canvas.addEventListener("touchend",touchEnd);
        canvas.addEventListener("mouseup",touchEnd);
        </script>
    </body>
    </html>
  • 相关阅读:
    [python] 类组合与聚合关系
    [python] 伪私有属性,防止变量名冲突
    [vim] 配置文件之常用命令模式
    [VIM] 编辑器---多行注释和取消注释及多行复制和黏贴
    [Visual Studio Code] 执行python
    [C] 编译器codeblocks安装注意
    字符串全排列
    集合全量子集提取
    random函数详解
    Solr常用命令总结
  • 原文地址:https://www.cnblogs.com/lalala2015/p/4481023.html
Copyright © 2020-2023  润新知