canvas刮刮卡

38 篇文章 1 订阅
22 篇文章 0 订阅

   

canvas刮刮卡实例,我修改前功能已经完成

只是移动端开发时,用比例(rem)单位时,测试时所刮位置有些偏,我自己相应改了一下

还有就是刮到一定程度时提示刮奖的结果,之前设置的是一个不定数值(设置不同色,数值都是变动的),要时时监控设置,我改了一下,改成可以设置成刮到指定百分比时提示刮奖结果,可灵活设置,设置如:(

//刮了90%的数值
gnumBIG = (w * h / 16) * .9;

还有些要注意的地方加了些备注

HTML代码:

 

<!DOCTYPE html>
<html>
<head>
<title>CANVAS 刮刮卡 demo</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no">
<style type="text/css">
*{ margin:0; padding:0;}
canvas{ vertical-align:middle; margin-left:3rem;}
</style>
</head>

<body>
<canvas id="canvas_id"></canvas>

<script type="text/javascript" src="http://code.jquery.com/jquery-2.0.0.min.js"></script>
<script type="text/javascript" src="scraping.js"></script>
<script type="text/javascript">
	init_canvas('获得奖品名称','刮开此处', true , $('#canvas_id').width() , $('#canvas_id').height());
	function scrapingEnd(){
		alert('已刮完');
	}
</script>
</body>
</html>


scraping.js代码:

 

 

var canvasID = 'canvas_id';//所使用的canvas的ID
var w , h , gnumBIG;

var mouseDown = false;
var isPop=false;
var canvas = {'temp': null, 'draw': null}; 
var main = null;
var tempctx = null;
var mainctx = null;
var c=null;
var txt='';
var tip='';
var touchable = true;
function init_canvas(text, tips, ta , canvasW , canvasH){
	w = canvasW;
	h = canvasH;
	//刮了90%的数值
	gnumBIG = (w * h / 16) * .9;
	
    txt = text;
    tip = tips;
    touchable = ta;
    
    c=$('#' + canvasID)[0];
    c.height=h;
    c.width=w;
    setupCanvases();
    
}
function recompositeCanvases() {
    
    tempctx = canvas.temp.getContext('2d');
    mainctx = main.getContext('2d');
    canvas.temp.width = canvas.temp.width;
    
    tempctx.drawImage(canvas.draw, 0, 0);

    tempctx.globalCompositeOperation = 'source-atop';
    tempctx.fillStyle="#ff6d56";//刮开后显示奖品的背景色
    tempctx.fillRect(0,0,w,h);
	//刮开后显示奖品的 文字设置
    tempctx.globalCompositeOperation = 'source-atop';
    tempctx.fillStyle="#FFFFFF";
    tempctx.lineWidth=30;
    tempctx.font="bolder 26px Microsoft YaHei";
    tempctx.textAlign="center";
    tempctx.textBaseline="Middle";
    tempctx.fillText(txt,w/2,h/2+7);
    
    mainctx.fillStyle = "#d6d6d6";//未刮开时提示刮开的文字背景色 ,此处色值修改时, 73  行对应数值相应修改
    mainctx.fillRect(0, 0,w,h);
	//未刮开时提示刮开的 文字设置
    mainctx.fillStyle="#666";
    mainctx.lineWidth=20;
    mainctx.font="24px Microsoft YaHei";
    mainctx.textAlign="center";
    mainctx.textBaseline="Middle";
    mainctx.fillText(tip,w/2,h/2+12);

    mainctx.globalCompositeOperation = 'source-atop';
    mainctx.fillStyle="#ffffff";
    mainctx.lineWidth=30;
    mainctx.font="bolder 20px Microsoft YaHei";
    mainctx.textAlign="center";
    mainctx.textBaseline="Middle";
    mainctx.fillText("",w/2,h/2+7);
	
    mainctx.drawImage(canvas.temp, 0, 0);

    var imgData=mainctx.getImageData(0,0,w,h);
    var gnum=0;
    for (var i=0;i<imgData.data.length;i+=64){
        if (imgData.data[i]!=214 ){//此  168  对应以上处 50 行色值对应RGB中R值
            gnum+=1;
        }
    }
	//console.log(gnum);
    if (gnum >= gnumBIG && !isPop){//此处判断是否刮完,可控制台监控设置数据
        scrapingEnd();
        isPop=true;
    }
}
function scratch(canv, x, y, fresh) {
	var ctx = canv.getContext('2d');
	ctx.lineWidth = 20;
	ctx.lineCap = 'round';
	ctx.lineJoin = 'round';

	if (fresh) {
		ctx.beginPath();
		ctx.moveTo(x + 0.01, y);
	}
	ctx.lineTo(x, y);
	ctx.stroke();
}
function mousedown_handler(e) {
	var local = getLocalCoords(c, e);
	mouseDown = true;

	scratch(canvas.draw, local.x, local.y, true);
	recompositeCanvases();

	if (e.cancelable) {
		e.preventDefault();
	}
	return false;
};

function mousemove_handler(e) {
	if (!mouseDown) {
		return true;
	}
	var local = getLocalCoords(c, e);

	scratch(canvas.draw, local.x, local.y, false);
	recompositeCanvases();

	if (e.cancelable) {
		e.preventDefault();
	}
	return false;
};

function mouseup_handler(e) {
	if (mouseDown) {
		mouseDown = false;
		if (e.cancelable) {
			e.preventDefault();
		}
		return false;
	}
	return true;
};
function setupCanvases() {
	main = document.getElementById(canvasID);

	main.width = w;
	main.height = h;

	canvas.temp = document.createElement('canvas');
	canvas.draw = document.createElement('canvas');

	canvas.temp.width = main.width;
	canvas.temp.height = main.height;
	canvas.draw.width = main.width;
	canvas.draw.height = main.height;

	recompositeCanvases();

    if(touchable){
        main.addEventListener('mousedown', mousedown_handler, false);
        main.addEventListener('touchstart', mousedown_handler, false);

        window.addEventListener('mousemove', mousemove_handler, false);
        window.addEventListener('touchmove', mousemove_handler, false);

        window.addEventListener('mouseup', mouseup_handler, false);
        window.addEventListener('touchend', mouseup_handler, false);
    }
}

function getLocalCoords(elem, ev) {
	var ox = 0, oy = 0;
	var first;
	var pageX, pageY;

    var pos = elem.getBoundingClientRect();
    ox = pos.left;
    oy = pos.top;
    var _w = elem.clientWidth;

	if (ev.touches) {
		first = ev.touches[0];
		pageX = first.pageX;
		pageY = first.pageY;
	} else {
		pageX = ev.pageX;
		pageY = ev.pageY;
	}
	return {
		'x' : (pageX - ox)*_w/w,
		'y' : (pageY - oy - (document.documentElement.scrollTop || document.body.scrollTop))*_w/w
	};
}

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值