<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<script src="./scratch.js"></script>
</head>
<body>
<canvas id="down" width=300 height=100 style="position:absolute;left:10px; top:10px; border:1px solid #333;" ></canvas>
<canvas id="up" width=300 height=100 style="position:absolute;left:10px; top:10px; border:1px solid #333"></canvas> <script>
var options = {
awards:['一等奖','二等奖','三等奖','特等奖','没中奖'],
maskColor:"gray",
textStyle:{
'size':'30',
'family':'Arial',
'align':'center',
'color':"orange"
},
radius:30
}
var scratch = new Scratch(options);
scratch.init();
</script>
</body>
</html>
(function (doc,win){
    var Scratch = function(options){
        this.options = options;
        this.up = doc.querySelector("#up");
        this.upCtx = this.up.getContext("2d");
        this.down = doc.querySelector("#down")
        this.downCtx = this.down.getContext("2d");

this.width = this.up.width;
        this.height = this.up.height;
    }

Scratch.prototype = {
            constructor: Scratch,
            init:function(){
                this.drawText();
                this.drawMask();
                this.addEvent();
            },
            drawText:function(){
                var ctx = this.downCtx;
                ctx.font = this.options.textStyle.size + "px " + this.options.textStyle.family;
                ctx.textAlign = this.options.textStyle.align;
                ctx.fillStyle = this.options.textStyle.color;
                ctx.textBaseline = "top";
                var random = parseInt(Math.random() * this.options.awards.length) || 0;
                this.award = this.options.awards[random];
                ctx.fillText(this.award,this.width/2,this.height/2 - this.options.textStyle.size/2);

},
            drawMask:function(){
                var ctx = this.upCtx;
                ctx.fillStyle = this.options.maskColor;
                ctx.fillRect(0,0,this.width,this.height);
                ctx.globalCompositeOperation = 'destination-out';
            },
            addEvent:function(){
                var _this = this;
                _this.up.addEventListener('mousedown',function(ev){
                    _this.up.addEventListener('mousemove',callback1 = function(ev){
                        var ctx = _this.upCtx;
                        var x = ev.clientX - _this.up.offsetLeft;
                        var y = ev.clientY - _this.up.offsetTop;
                        var radius = _this.options.radius;
                        ctx.beginPath();
                        var gradient = ctx.createRadialGradient(x, y, 0, x, y, options.radius);
                        gradient.addColorStop(0,"rgba(255, 255, 255, 0.3)");
                        gradient.addColorStop(1,"rgba(255, 255, 255, 0)");
                        ctx.fillStyle = gradient;
                        ctx.arc(x, y, radius, 0, Math.PI * 2, true);
                        ctx.fill();
                        ctx.closePath();

if(_this.result() > 0.8){
                            alert(_this.award);
                        }

},false)

doc.addEventListener('mouseup',callback2 = function(ev){
                        _this.up.removeEventListener('mousemove',callback1);
                        doc.removeEventListener('mouseup',callback2);
                    },false)
                },false)

},
            result:function(){
                //文字宽度
                var textWidth = this.options.textStyle.size * this.award.length;
                //文字高度
                var textHeight = this.options.textStyle.size;
                var transPixel = [];
                var imgData = this.upCtx.getImageData(this.width/2-textWidth/2,this.height/2-textHeight/2,textWidth,textHeight);
                var pixels = imgData.data;
                for(var i = 0; i < pixels.length; i += 4){
                    var a = pixels[i+3];
                    if(a < 128){
                        transPixel.push(a);
                    }
                }
                return transPixel.length / (pixels.length/4);
            }

};
    win.Scratch = Scratch;

})(document,window)

canvas 之刮刮卡的更多相关文章

  1. canvas 绘制刮刮卡

    思路=> 用div来展示刮奖结果,用canvas绘制刮奖前展示的图片或者文字:将canvas叠在div上方,刮奖是只需要操作canvas配合touch事件即可简单完成. canvas刮奖可以用g ...

  2. canvas实现刮刮卡效果

    canvas实现刮刮卡效果 实现步骤: 设置页面背景图,即刮刮卡底部图片 绘制canvas 刮刮卡顶部图片drawImage 绑定事件 addEventListener  touchstart.tou ...

  3. qt qml 刮刮卡效果

    用canvas+mouseArea实现的刮刮卡效果. 表层是一层色彩,用手指划开,可看到下面的文字Lisence: MIT, 请保留本文档说明Author: surfsky.cnblogs.com 2 ...

  4. 网页闯关游戏(riddle webgame)--H5刮刮卡的原理和实践

    前言: 之前编写了一个网页闯关游戏(类似Riddle Game), 除了希望大家能够体验一下我的游戏外. 也愿意分享编写这个网页游戏过程中, 学到的一些知识. 对于刮刮卡, 想必大家都很熟悉, 也很喜 ...

  5. Html5实现移动端、PC端 刮刮卡效果

    刚从南方回来就分了一个刮刮卡效果的页面,特么的我在烦恼怎么用H5去实现这个效果呢,好不容易写出来了,产品居然说:“既然你可以写出来这个效果那当然好了,开始我只是打算让你实现点击就出现呢!”… … 尼玛 ...

  6. 用c#开发微信 (16) 微活动 2 刮刮卡

    微信营销是一种新型的营销模式,由于微信更重视用户之间的互动,故而这种营销推广不不能盲目地套用微博营销的单纯大量广告推送方式.这种方式在微信营销中的效果非常差,会令用户反感,继而取消去企业或商家的微信公 ...

  7. Atitit .html5刮刮卡的gui实现总结

    Atitit .html5刮刮卡的gui实现总结 #----两个案例canvas或者wScratchPad-1.4.4 1 #----1.添加panel  ,这个十mask div.....posti ...

  8. 使用HTML5实现刮刮卡效果

    你玩过刮刮卡么?一不小心可以中奖的那种.今天我给大家分享一个基于HTML5技术实现的刮刮卡效果,在PC上只需按住鼠标,在手机上你只需按住指头,轻轻刮去图层就可以模拟真实的刮奖效果. 我们利用HTML5 ...

  9. Android 自定义View修炼-【2014年最后的分享啦】Android实现自定义刮刮卡效果View

    一.简介: 今天是2014年最后一天啦,首先在这里,我祝福大家在新的2015年都一个个的新健康,新收入,新顺利,新如意!!! 上一偏,我介绍了用Xfermode实现自定义圆角和椭圆图片view的博文& ...

  10. Android刮刮卡自定义控件

    网上的都是自己绘制的或者图片,我的需求是可以随意的自定义底部和顶部的布局.所以自己重写一个,原理就是直接继承 View 来实现一个刮层,让这个刮层和图片以及文字不产生任何依赖,再结合 FrameLay ...

随机推荐

  1. Func和Action的用法区别

    平时我们如果要用到委托一般都是先声明一个委托类型,比如: private delegate string Say(); string说明适用于这个委托的方法的返回类型是string类型,委托名Say后 ...

  2. mac_Alfred_快捷设置

    1.安装(不说了去 Google 吧) 2.基础快捷键:option+space 3.打开应用程序:Alfred 几乎是一切程序的入口,你再也不需要找妈妈要开始菜单了.用快捷键呼出Alfred,输入任 ...

  3. ArcGIS网络分析之Silverlight客户端最近设施点分析(四)

    原文:ArcGIS网络分析之Silverlight客户端最近设施点分析(四) 在上一篇中说了如何实现最近路径分析,本篇将讨论如何实现最近设施点分析. 最近设施点分析实际上和路径分析有些相识,实现的过程 ...

  4. Android_显示器本身被卸载应用程序

    1.经jni实现功能 //LOG宏定义 #define LOG_INFO(tag, msg) __android_log_write(ANDROID_LOG_INFO, tag, msg) #defi ...

  5. 基于ip san的iscsi操作执行过程

    SAN它是storage area network(存储区域网络)速记,早期san光纤通道技术被用于.当迟到iscsi协议后出现,为了在这两者之间区分.它分IP SAN和FC SAN.FC SAN由于 ...

  6. vs2012 + web api + OData + EF + MYsql

    vs2012 + web api + OData + EF + MYsql 开发及部署 先说下我的情况,b/s开发这块已经很久没有搞了,什么web api .MVC.OData都只是听过,没有实际开发 ...

  7. Linux经常使用命令(一) - ls

    ls命令是linux下最经常使用的命令.ls命令就是list的缩写, 缺省下ls用来打印出当前文件夹的清单, 假设ls指定其它文件夹, 那么就会显示指定文件夹里的文件及文件夹清单. 通过ls 命令不仅 ...

  8. 尚学堂Java面试题整理

    博客分类: 经典分享   1. super()与this()的差别? - 6 -  2. 作用域public,protected,private,以及不写时的差别? - 6 -  3. 编程输出例如以 ...

  9. POJ 2724 Purifying Machine(最大独立集)

    POJ 2724 Purifying Machine 题目链接 题意:这题题意有点没看懂.看了别人的题解, 给出m串长度为n的01串. 有些串中可能包括,这种串能够表示两个串,为1 和为0. 反复的算 ...

  10. PHP支付接口RSA验证

    PHP 验签 Sign 验签数据准备: 公钥(Public key) Sign签名(一般是base64加密过的) Data参数(参数列表,Sign对应的参数值) php的openssl扩展里已经封装好 ...