详解HTML5实现橡皮擦的擦除效果的示例代码(图)


当前第2页 返回上一页

  此处注意,我是把检查像素这段代码方法mouseup事件里面的,因为这个计算量相对来说还是不小,如果用户狂点鼠标,就会狂触发mouseup事件,也就是会疯狂的触发那个循环计算像素,计算量大到阻塞进程,导致界面卡住的情况,缓解办法如下:加个timeout,延迟执行像素计算,而在每一次点击的时候再清除timeout,也就是如果用户点击很快,这个计算也就触发不了了,还有一个提升的办法就是抽样检查,我上面的写法是逐个像素检查,逐个像素检查的话像素量太大,肯定会卡的,所以可以采用抽样检查,比如每隔30个像素检查一次,修改后的代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

timeout = setTimeout(function(){   

var imgData = ctx.getImageData(0,0,canvas.width,canvas.height);   

var dd = 0;   

for(var x=0;x<imgData.width;x+=30){       

for(var y=0;y<imgData.height;y+=30){           

var i = (y*imgData.width + x)*4;           

if(imgData.data[i+3] >0){

                dd++

            }

        }

    }    if(dd/(imgData.width*imgData.height/900)<0.4){

        canvas.className = "noOp";

    }

},100)

  这样就可以较大限度的防止用户狂点击了,如果有其他更好的检查方法欢迎给出意见,谢谢。

  到了这一步就都写完了,然后就是测试的时候了,结果并不乐观,在android上还是卡啊卡啊,所以又得另想办法,最终发现了绘图环境中的globalCompositeOperation这个属性,这个属性的默认值是source-over,也就是,当你在已有像素上进行绘图时会叠加,但是还有一个属性是destination-out,官方解释就是:在源图像外显示目标图像。只有源图像外的目标图像部分才会被显示,源图像是透明的。好像不太好理解,但是其实自己测试一下就会发现很简单,也就是在已有像素的基础上进行绘图时,你绘制的区域里的已有像素都会被置为透明,直接看张图更容易理解:

   globalCompositeOperation属性效果图解。

  有了这个属性后,就意味着不需要用到clip,也就不需要用sin、cos什么的计算剪辑区域,直接用条粗线就行了,这样一来就能够很大限度的降低了计算量,同时减少了绘图环境API的调用,性能提升了,在android上运行应该也会流畅很多,下面是修改后的代码:


1

2

3

4

5

hastouch = "ontouchstart"  window?:= hastouch?"touchstart":"mousedown"= hastouch?"touchmove":"mousemove"= hastouch?"touchend":"mouseup"=

hastouch?e.targetTouches[0].pageX:e.clientX-= hastouch?e.targetTouches[0].pageY:e.clientY-= "round"= "round"= a*2= "destination-out"1,0,2*

imgData = ctx.getImageData(0,0 dd = 0( x=0;x<imgData.width;x+=30(

y=0;y<imgData.height;y+=30 i = (y*imgData.width + x)*4(imgData.data[i+3] > 0++(dd/(imgData.width*imgData.height/900)<0.4){

               canvas.className = "noOp"= hastouch?e.targetTouches[0].pageX:e.clientX-= hastouch?e.targetTouches[0].pageY:e.clientY-==

  擦除那部分代码就这么一点,也就相当于画图功能,直接设置line属性后通过lineTo进行绘制线条,只要事前把globalCompositeOperation设成destination-out,你所进行的一切绘制,都变成了擦除效果。鼠标滑动触发的事件里面代码也少了很多,绘图对象的调用次数减少了,计算也减少了,性能提升大大滴。

  改好代码后就立即用自己的android机子测试了一下,果然如此,跟上一个相比,流畅了很多,至少达到了客户要求的能玩的地步了。

以上就是详解HTML5实现橡皮擦的擦除效果的示例代码(图)的详细内容,更多文章请关注木庄网络博客

返回前面的内容

相关阅读 >>

什么是notifications?HTML5 notifications桌面提醒

HTML5 解决苹果手机不能自动播放音乐问题的相关技巧

具体解析HTML5文件读取filereader及文件读取模块的封装

通过HTML5实现图片上传与预览功能

h5的新增标签和废弃标签

HTML5游戏框架cngamejs开发实录-碰撞检测模块篇

HTML5程序员需要学习的技能总结

HTML5实现一个简单的在线画板

自定义HTML5 progress的样式的图文代码详解

分享一个HTML5实现拖放的实例代码

更多相关阅读请进入《HTML5》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...