canvas实现刮刮卡效果,计算擦除面积时不兼容手机端

相当之稳重 2015-03-16 10:05:29
问题:PC上正常,手机上第50行执行不了(计算擦除面积处),哪位大哥能帮忙看看吗

全部代码如下,拷贝可直接运行(随便弄2张图片放在html文件一致的路径下,pet.jpg和pet2.jpg):


<!doctype html>
<html lang="zh-cn">
<head>
<meta charset="utf-8">
<title>html5 canvas</title>
<meta name="apple-touch-fullscreen" content="yes" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
</head>
<body>
<canvas></canvas>
<script>
(function(bodyStyle) {
bodyStyle.mozUserSelect = 'none';
bodyStyle.webkitUserSelect = 'none';

var img = new Image();
var canvas = document.querySelector('canvas');
canvas.style.backgroundColor='transparent';
canvas.style.position = 'absolute';

img.addEventListener('load', function(e) {
var ctx;
var w = img.width,
h = img.height;
var offsetX = canvas.offsetLeft,
offsetY = canvas.offsetTop;
var mousedown = false;

function layer(ctx) {

var img=document.getElementById("lamp");
var pat=ctx.createPattern(img,"repeat");

ctx.fillStyle = pat;
ctx.fillRect(0, 0, w, h);
}

function eventDown(e){
e.preventDefault();
mousedown=true;
}

function eventUp(e){
e.preventDefault();
mousedown = false;

alert('0');
var data = ctx.getImageData(0,0,w,h).data;
alert('1');

for(var i=0,j=0;i<data.length;i+=4){
if(data[i] && data[i+1] && data[i+2] && data[i+3]){
j++;
}
}
//当图层被擦除剩余80%时触发
if(j<=w*h*0.8){
ctx.clearRect(0,0,w,h);
}
}

function eventMove(e){
e.preventDefault();
if(mousedown) {
if(e.changedTouches){
e=e.changedTouches[e.changedTouches.length-1];
}
var x = (e.clientX + document.body.scrollLeft || e.pageX) - offsetX || 0,
y = (e.clientY + document.body.scrollTop || e.pageY) - offsetY || 0;
with(ctx) {
beginPath()
arc(x, y, 20, 0, Math.PI * 2);
fill();
}
}
}

canvas.width=w;
canvas.height=h;
canvas.style.backgroundImage='url('+img.src+')';
ctx=canvas.getContext('2d');
ctx.fillStyle='transparent';
ctx.fillRect(0, 0, w, h);
layer(ctx);

ctx.globalCompositeOperation = 'destination-out';

canvas.addEventListener('touchstart', eventDown);
canvas.addEventListener('touchend', eventUp);
canvas.addEventListener('touchmove', eventMove);
canvas.addEventListener('mousedown', eventDown);
canvas.addEventListener('mouseup', eventUp);
canvas.addEventListener('mousemove', eventMove);
});
img.src = 'pet.jpg';
})(document.body.style);
</script>

<img id="lamp" src="pet2.jpg">
</body>
</html>

...全文
551 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
dengrc_ 2015-03-17
  • 打赏
  • 举报
回复
以前遇到有的手机,刮了没有重新渲染,触摸的地方颜色没有变。canvas 隐藏再显示后就重新渲染了。 所以就用这样的方式,不断的显示隐藏,感觉没有闪屏。
setInterval(function(){canvas.style.display='none'},25);
setInterval(function(){canvas.style.display='block'},25)
业余草 2015-03-17
  • 打赏
  • 举报
回复
可以配合截图说明一下,还有是哪款手机出现的问题?
KK3K2005 2015-03-16
  • 打赏
  • 举报
回复
不用这么严谨 考虑用户行为 弄一个全局变量 eventMove 里面每画一个圈圈 变量就累加次 通过这个数字大小来判断 是不是 clear 数字大小测试几次就可以了
xuzuning 2015-03-16
  • 打赏
  • 举报
回复
经测试,没有发现你说的问题 2 个 alert 都可弹出,只是 alert('1'); 后就全部擦除了 注释掉 alert 后,表现基本正常

39,084

社区成员

发帖
与我相关
我的任务
社区描述
HTML5是构建Web内容的一种语言描述方式。HTML5是互联网的下一代标准,是构建以及呈现互联网内容的一种语言方式.被认为是互联网的核心技术之一。
社区管理员
  • HTML5社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧