html5 canvas制作刮刮卡

html5 canvas制作刮刮卡下班后 闲着无事 刚好近期在学习画布相关知识 就写了个刮刮卡的 demo 练一下手 兼容安卓 IOS 哦 高手路过 多多指点 刮刮卡实现原理 通过 canvas 绘制一个图片 用户手指触发屏幕时 刮开当前一部分封面图 从而显示正文中的内容 整体运用 canvas 的 globalCompos 属性来实现 关于 globalCompos 的用法 有不熟悉的 可

下班后,闲着无事,刚好近期在学习画布相关知识,就写了个刮刮卡的demo练一下手,兼容安卓、IOS哦。高手路过,多多指点!

 

刮刮卡实现原理:

通过canvas绘制一个图片,用户手指触发屏幕时,刮开当前一部分封面图,从而显示正文中的内容。整体运用canvas的globalCompositeOperation属性来实现,关于globalCompositeOperation的用法,有不熟悉的,可以去这里查看。

 

简单介绍一下页面整体结构:

1 <div class="wrap"> 2   <canvas class="page can" id="can" width="640" height="1136"></canvas> 3   <div class="page index"><img src="images/1.jpg" /></div> 4 </div>

 

样式:

1 html,body { 
    margin: 0; height: 100%; } 2 .wrap { 
    width: 640px; height: 100%; margin: 0 auto; position: relative; overflow: hidden; } 3  .page { 
    width: 100%; height: 100%; position: absolute; top: 0; left: 0;} 4  .can { 
    z-index: 3; } 5  .index img { 
    width: 100%; height: 100%; }

 

引用JS:

 

下面, 详细介绍一下关于scratch.js的具体实现思路与方法:

通过JS闭包引用:

;(function($){ 
   
  //主体代码
  //...
})(jQuery);


首先,定义默认参数:

1 //默认参数 2 var defaults = { 3 lineWidth: 50, //笔触宽度  4 percent: '0.6', //刮开范围 5 slideImg: 'images/2.jpg', //封面图 6 callback: function(){ //刮开后回调函数 7 alert('你太棒了,么么哒!') 8  } 9 };

 

核心逻辑:

说明:刮刮卡效果是借助canvas自身的属性来编写的,所以需要先获取页面中canvas对象,并创建2d绘图环境。

var can = ths.get(0).getContext('2d');

然后,创建image对象,img加载成功后,调用canvas的drawImage方法,绘制封面图,并设置绘制的属性,注意下文标部分代码:

 1 var img = new Image(); //创建图片对象  2 img.src = slideImg; //添加路径  3 img.onload = function(){ //图片加载完成,调用下面方法  4 can.drawImage(img, (640-wid)/2, 0, wid, hei); //绘制图片  5 can.strokeStyle = 'gray'; //绘制颜色  6 can.lineWidth = lineWidth; //线宽  7 can.lineCap = 'round'; //样式  8  can.globalCompositeOperation = 'destination-out'; //利用两图相交取透明的原理  9 //绘制完成,调用刮卡事件 10  slide(ths, can); 11 }

 

下面是slide方法,主要判断手势、绘制路径与刮开层等效果。当touchend时,计算划开像素点,目标设置为刮开60%时,封面图自动消失。注意下面标注部分代码:

 1 function slide(o,c){  2 o.on('touchstart', function(e){  3 var e = e||e.event;  4 var tou = e.originalEvent.changedTouches[0];  5 var x = tou.pageX - $(this).offset().left;  6 var y = tou.pageY - $(this).offset().top;  7  8 if(flag){  9 flag = false; 10  c.moveTo(x, y); 11 c.lineTo(x+1, y+1); 12 }else{ 13 c.lineTo(x+1, y+1); 14  } 15  c.stroke(); 16 17 o.on('touchmove.mo', function(e){ 18 var e = e||e.event; 19 var tou = e.originalEvent.changedTouches[0]; 20 var x = tou.pageX - $(this).offset().left; 21 var y = tou.pageY - $(this).offset().top; 22 23 c.lineTo(x+1, y+1); 24  c.stroke(); 25  }) 26 27 o.on('touchend.mo', function(e){ 28 var imgData = c.getImageData(0, 0, 640, hei); 29 var aPx = imgData.width * imgData.height; 30 var num = 0; 31 for(var i=0; i<aPx; i++){ 32 if(imgData.data[4*i+3] == 0){ 33 num++; 34  } 35  } 36 37 if(num>aPx*percent){ 38 o.animate({opacity: 0}, 1000, function(){ 39 $(this).remove(); 40 41  callback(); 42  }) 43  } 44 45 o.off('.mo'); 46  }) 47 48  }) 49 50 }

 至此,整个刮刮功能已讲解完毕,感兴趣的童鞋赶快试一试吧!如有问题,可以通过()联系。

 

转载于:https://www.cnblogs.com/front-end/p/4787108.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/232361.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java中的类[通俗易懂]

    java中的类[通俗易懂]4.1.类是什么?  1.类–类型–数据类型—复合数据类型—自定义复合数据类型  为什么有复合数据类型?  基本数据类型就8种,在开发中远远不够,所以我们就需要一个可以根据自己的需求随时能制作出一个自己需要的数据类型。  2.类–具有共同性质的一组事物的群体。人类。  在java中用来描述具有共同性质的一组事物的自定义的复合数据类型—类。  复合数据类型的本质—【根据自己的

    2022年7月7日
    23
  • 利用远程外网服务器搭建代理服务器[通俗易懂]

    利用远程外网服务器搭建代理服务器[通俗易懂]安装CCProxy官网地址:http://www.ccproxy.com/下载安装即可,软件使用很简单。配置CCProxy配置端口基本上不需要配置什么,只要你将默认的端口改为你的端口号就行,不改可能会被其他软件扫描到。新增账号新增账号支持访问,具体权限可以看说明。选择你的远程服务器特别说明:你的服务器一定要配置安全组,否则端口无法访问。通过服务器中的teln…

    2022年5月1日
    169
  • java中static关键字的作用_Java:Java中static关键字作用

    java中static关键字的作用_Java:Java中static关键字作用static关键字最基本的用法是:1、被static修饰的变量属于类变量,可以通过类名.变量名直接引用,而不需要new出一个类来2、被static修饰的方法属于类方法,可以通过类名.方法名直接引用,而不需要new出一个类来3、被static修饰的变量、被static修饰的方法统一属于类的静态资源,是类实例之间共享的。@JDK把不同的静态资源放在了不同的类中为什么不把所有静态资源放在一个类里面呢?…

    2022年7月8日
    17
  • 常见银行编码收集_各银行代码简称

    常见银行编码收集_各银行代码简称{"message":"success","code":"M00000","data":

    2022年8月2日
    9
  • 不是单组分组函数「建议收藏」

    不是单组分组函数「建议收藏」问题:一:SELECT tablespace_name, SUM(bytes) freeFROM dba_free_space不是单组分组函数原因: 1、如果程序中使用了分组函数,则有两种情况可以使用:程序中存在group by,并指定了分组条件,这样可以将分组条件一起查询出来改为:  SELECT tablespace_name, SUM(bytes) freeFROM dba_free_spa…

    2022年6月30日
    37
  • Circos入门_circor

    Circos入门_circor是那个基于perl的CircosMac/Linux的安装可以参考之前的文章【传送门】Window安装会有点麻烦01官网教程必读内容这不是一个手把手教程,所以如果想解circos的使用,推荐…

    2025年7月14日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号