问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

html5 canvas 刮刮卡问题

发布网友 发布时间:2022-04-29 17:07

我来回答

1个回答

热心网友 时间:2022-04-20 00:41


<!DOCTYPE html>
<html>
<head>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  <title> - jsFiddle demo by artwl</title>
  
  <script type='text/javascript' src='/js/lib/mmy.js'></script>
  
  
  
  
  <link rel="stylesheet" type="text/css" href="/css/result-light.css">
  
  <style type='text/css'>
    body{
    height:1000px;
}
#lotteryContainer {
    position:relative;
    width: 300px;
    height:100px;
}
#drawPercent {
    color:#F60;
}
  </style>
  
</head>
<body>
  <button id="freshBtn">刷新</button><label>已刮开 <span id="drawPercent">0%</span> 区域。</label>
<div id="lotteryContainer"></div>
  


<script type='text/javascript'>//<![CDATA[ 

function Lottery(id, cover, coverType, width, height, drawPercentCallback) {
    this.conId = id;
    this.conNode = document.getElementById(this.conId);
    this.cover = cover;
    this.coverType = coverType;
    this.background = null;
    this.backCtx = null;
    this.mask = null;
    this.maskCtx = null;
    this.lottery = null;
    this.lotteryType = 'image';
    this.width = width || 300;
    this.height = height || 100;
    this.clientRect = null;
    this.drawPercentCallback = drawPercentCallback;
}

Lottery.prototype = {
    createElement: function (tagName, attributes) {
        var ele = document.createElement(tagName);
        for (var key in attributes) {
            ele.setAttribute(key, attributes[key]);
        }
        return ele;
    },
    getTransparentPercent: function(ctx, width, height) {
        var imgData = ctx.getImageData(0, 0, width, height),
            pixles = imgData.data,
            transPixs = [];
        for (var i = 0, j = pixles.length; i < j; i += 4) {
            var a = pixles[i + 3];
            if (a < 128) {
                transPixs.push(i);
            }
        }
        return (transPixs.length / (pixles.length / 4) * 100).toFixed(2);
    },
    resizeCanvas: function (canvas, width, height) {
        canvas.width = width;
        canvas.height = height;
        canvas.getContext('2d').clearRect(0, 0, width, height);
    },
    drawPoint: function (x, y) {
        this.maskCtx.beginPath();
        var radgrad = this.maskCtx.createRadialGradient(x, y, 0, x, y, 30);
        radgrad.addColorStop(0, 'rgba(0,0,0,0.6)');
        radgrad.addColorStop(1, 'rgba(255, 255, 255, 0)');
        this.maskCtx.fillStyle = radgrad;
        this.maskCtx.arc(x, y, 30, 0, Math.PI * 2, true);
        this.maskCtx.fill();
        if (this.drawPercentCallback) {
            this.drawPercentCallback.call(null, this.getTransparentPercent(this.maskCtx, this.width, this.height));
        }
    },
    bindEvent: function () {
        var _this = this;
        var device = (/android|webos|iphone|ipad|ipod|blackberry|iemobile|opera mini/i.test(navigator.userAgent.toLowerCase()));
        var clickEvtName = device ? 'touchstart' : 'mousedown';
        var moveEvtName = device? 'touchmove': 'mousemove';
        if (!device) {
            var isMouseDown = false;
            document.addEventListener('mouseup', function(e) {
                isMouseDown = false;
            }, false);
        } else {
            document.addEventListener("touchmove", function(e) {
                if (isMouseDown) {
                    e.preventDefault();
                }
            }, false);
            document.addEventListener('touchend', function(e) {
                isMouseDown = false;
            }, false);
        }
        this.mask.addEventListener(clickEvtName, function (e) {
            isMouseDown = true;
            var docEle = document.documentElement;
            if (!_this.clientRect) {
                _this.clientRect = {
                    left: 0,
                    top:0
                };
            }
            var x = (device ? e.touches[0].clientX : e.clientX) - _this.clientRect.left + docEle.scrollLeft - docEle.clientLeft;
            var y = (device ? e.touches[0].clientY : e.clientY) - _this.clientRect.top + docEle.scrollTop - docEle.clientTop;
            _this.drawPoint(x, y);
        }, false);

        this.mask.addEventListener(moveEvtName, function (e) {
            if (!device && !isMouseDown) {
                return false;
            }
            var docEle = document.documentElement;
            if (!_this.clientRect) {
                _this.clientRect = {
                    left: 0,
                    top:0
                };
            }
            var x = (device ? e.touches[0].clientX : e.clientX) - _this.clientRect.left + docEle.scrollLeft - docEle.clientLeft;
            var y = (device ? e.touches[0].clientY : e.clientY) - _this.clientRect.top + docEle.scrollTop - docEle.clientTop;
            _this.drawPoint(x, y);
        }, false);
    },
    drawLottery: function () {
        this.background = this.background || this.createElement('canvas', {
            style: 'position:absolute;left:0;top:0;'
        });
        this.mask = this.mask || this.createElement('canvas', {
            style: 'position:absolute;left:0;top:0;'
        });

        if (!this.conNode.innerHTML.replace(/[\w\W]| /g, '')) {
            this.conNode.appendChild(this.background);
            this.conNode.appendChild(this.mask);
            this.clientRect = this.conNode ? this.conNode.getBoundingClientRect() : null;
            this.bindEvent();
        }

        this.backCtx = this.backCtx || this.background.getContext('2d');
        this.maskCtx = this.maskCtx || this.mask.getContext('2d');

        if (this.lotteryType == 'image') {
            var image = new Image(),
                _this = this;
            image.onload = function () {
                _this.width = this.width;
                _this.height = this.height;
                _this.resizeCanvas(_this.background, this.width, this.height);
                _this.backCtx.drawImage(this, 0, 0);
                _this.drawMask();
            }
            image.src = this.lottery;
        } else if (this.lotteryType == 'text') {
            this.width = this.width;
            this.height = this.height;
            this.resizeCanvas(this.background, this.width, this.height);
            this.backCtx.save();
            this.backCtx.fillStyle = '#FFF';
            this.backCtx.fillRect(0, 0, this.width, this.height);
            this.backCtx.restore();
            this.backCtx.save();
            var fontSize = 30;
            this.backCtx.font = 'Bold ' + fontSize + 'px Arial';
            this.backCtx.textAlign = 'center';
            this.backCtx.fillStyle = '#F60';
            this.backCtx.fillText(this.lottery, this.width / 2, this.height / 2 + fontSize / 2);
            this.backCtx.restore();
            this.drawMask();
        }
    },
    drawMask: function() {
        this.resizeCanvas(this.mask, this.width, this.height);
        if (this.coverType == 'color') {
            this.maskCtx.fillStyle = this.cover;
            this.maskCtx.fillRect(0, 0, this.width, this.height);
            this.maskCtx.globalCompositeOperation = 'destination-out';
        } else if (this.coverType == 'image'){
            var image = new Image(),
                _this = this;
            image.onload = function () {
                _this.maskCtx.drawImage(this, 0, 0);
                _this.maskCtx.globalCompositeOperation = 'destination-out';
            }
            image.src = this.cover;
        }
    },
    init: function (lottery, lotteryType) {
        this.lottery = lottery;
        this.lotteryType = lotteryType || 'image';
        this.drawLottery();
    }
}

window.onload = function () {
    var lottery = new Lottery('lotteryContainer', '#CCC', 'color', 300, 100, drawPercent);
    lottery.init('http://www.baidu.com/img/bdlogo.gif', 'image');
    
    document.getElementById('freshBtn').onclick = function() {
        drawPercentNode.innerHTML = '0%';
        lottery.init(getRandomStr(10), 'text');
    }
    
    var drawPercentNode = document.getElementById('drawPercent');
    
    function drawPercent(percent) {
        drawPercentNode.innerHTML = percent + '%';
    }
}

function getRandomStr(len) {
    var text = "";
    var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
    for( var i=0; i < len; i++ )
        text += possible.charAt(Math.floor(Math.random() * possible.length));
    return text;
}
//]]>  

</script>


</body>


</html>

亲,看看这个对你有帮助么

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
抖音仅一人可见的作者知道吗? 白歆惠最新消息 白歆惠主要作品 白钦惠基本资料 风电运维公司有哪些 白歆惠出席节目 白歆惠主持经历 白歆惠人物轶事 ...唱的lalalali,lulalulali(啦啦啦啦哩,噜啦噜啦哩) ...今年6岁,想给孩子起个小名,望各位高手指点!!! 请问一下改了OPPO实名认证会不会清除游戏里的东西?如果清除了,再设置回来游戏里的东西还在吗? OPPO账户清除实名认证,OPPO账号登录的游戏会不会被注销? 刮刮乐中奖图片100万 俺知 OPPO手机修改了实名认证会清除游戏数据吗? oppo账号实名清除后对游戏账号有什么影响? 魔兽世界刮刮卡凶暴迅猛龙什么样子,和巨魔的龙有什么区别,最好来张图片。 现在什么样交友软件人气最火 怎样去掉电脑桌面图标的箭头,我的是win7 百度知道最新版的刮刮卡奖励的在那里找?怎么都找不到 广告词里面有个无乐不作什么什么的社交软件 我的刮刮卡在哪里,就详细 求交友聚会的宣传语!! 这种意大利刮刮乐怎么看中没中奖啊 图片来自网络 婚介宣传语怎么写 624千焦等于多少大卡 关于交朋友的标语 WOW的刮刮卡是怎么样的? 2374千焦是多少卡路里大卡路里等于多少千焦千焦 他/她与你不期而遇是什么产品宣传语啊? 刮刮卡,谁知道这刮刮卡是怎样做的!因为我做不多,就是想弄充值卡那样的! 与可画竹时,胸有成竹是什么意思 刮刮卡 印卡通图片 犯法吗 oppo实名认证解除游戏账号还是原来的吗? 关于sql 里 like 的用法求助 oppo商店清除实名制有啥后果 想换个身份认证 这样的话游戏还能玩吗... 携程那个刮刮卡是从客户端哪里进去啊 江苏一男子半年偷上百次刮刮乐兑奖7万,是如何被警方抓获的? oppo账号只删除实名信息游戏数据还会有吗? oppo手机清除实名认后还能登录嘛? 成语“胸有成竹”是什么意思 oppo账号清除个人数据,会影响游戏嘛? oppo实名清除会影响游戏账号吗? 胸有成竹的意思是什么?? OPPO账号清除个人数据后是不是会把实名认证也一起清除了? yy好友删了之后还能看见聊天记录吗 yy好友被删除了能看到聊天记录了吗 对方yy号注销了还有聊天记录吗 删除的yy好友重新加入可以看到所有的历史信息吗? YY好友删除后还能不能找到聊天记录 和yy好友的聊天记录怎么没了?