• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com专业计算机教程网站
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • html/xhtml
  • html5
  • CSS
  • XML/XSLT
  • Dreamweaver教程
  • Frontpage教程
  • 心得技巧
  • bootstrap
  • vue
  • AngularJS
  • HBuilder教程
  • css3
  • 浏览器兼容
  • div/css
  • 网页编辑器
  • axure
您的位置:首页 > 网页设计 >html5 > 用HTML5 实现橡皮擦的涂抹效果的教程_html5教程技巧

用HTML5 实现橡皮擦的涂抹效果的教程_html5教程技巧

作者:匿名 字体:[增加 减小] 来源:互联网 时间:2018-12-03

本文主要包含HTML5等相关知识,匿名希望在学习及工作中可以帮助到您
最近项目刚好用到这种效果,也就是有点像刮刮卡一样,在移动设备上,把某张图片刮掉显示出另一张图片。效果图如下:
2015511163305472.png (974×840)

DEMO请戳右:DEMO
这种在网上还是挺常见的,本来就想直接网上找个demo套用下他的方法就行了,套用了才发现,在android上卡出翔了,因为客户要求,在android不要求特别流畅,至少要能玩,但是网上找的那个demo实在太卡,根本就是没法玩的情况。于是就想自己写一个算了,本文也就权当记录一下研究过程。

  这种刮图的效果,首先想到就是用HTML5的canvas来实现,而canvas的API中,可以清除像素的就是clearRect方法,但是clearRect方法的清除区域矩形,毕竟大部分人的习惯中的橡皮擦都是圆形的,所以就引入了剪辑区域这个强大的功能,也就是clip方法。用法很简单: 

  1. ctx.save()
  2. ctx.beginPath()
  3. ctx.arc(x2,y2,a,0,2*Math.PI);
  4. ctx.clip()
  5. ctx.clearRect(0,0,canvas.width,canvas.height);
  6. ctx.restore();

  上面那段代码就实现了圆形区域的擦除,也就是先实现一个圆形路径,然后把这个路径作为剪辑区域,再清除像素就行了。有个注意点就是需要先保存绘图环境,清除完像素后要重置绘图环境,如果不重置的话以后的绘图都是会被限制在那个剪辑区域中。

  擦除效果有了,现在就是写鼠标移动擦除的效果了,下面我均用鼠标来描述,因为移动端也差不多,就是把mousedown换成touchstart,mousemove换成touchmove,mouseup换成touchend、以及获取坐标点由e.clientX换成e.targetTouches[0].pageX而已。

  实现鼠标移动擦除,刚开始就是想到鼠标移动时在触发的mousemove事件中对鼠标所在位置进行圆形区域擦除,写出来后发现,当鼠标移动速度很快的时候,擦除的区域就不连贯了,就会出现下面这种效果,这显然不是我们想要的橡皮擦擦除效果。
2015511163949198.jpg (1103×693)

既然所有点不连贯,那接下来要做的事就是把这些点连贯起来,如果是实现画图功能的话,就可以直接通过lineTo把两点之间连接起来再绘制,但是擦除效果中的剪辑区域要求要是闭合路径,如果是单纯的把两个点连起来就无法形成剪辑区域了。然后我就想到用计算的方法,算出两个擦除区域中的矩形四个端点坐标来实现,也就是下图中的红色矩形:
2015511164105508.png (343×129)

计算方法也很简单,因为可以知道两个剪辑区域连线两个端点的坐标,又知道我们要多宽的线条,矩形的四个端点坐标就变得容易求了,所以就有了下面的代码:
XML/HTML Code复制内容到剪贴板

  1. var aasin = a*Math.sin(Math.atan((y2-y1)/(x2-x1)));
  2. var aacos = a*Math.cos(Math.atan((y2-y1)/(x2-x1)))
  3. var x3 = x1+asin;
  4. var y3 = y1-acos;
  5. var x4 = x1-asin;
  6. var y4 = y1+acos;
  7. var x5 = x2+asin;
  8. var y5 = y2-acos;
  9. var x6 = x2-asin;
  10. var y6 = y2+acos;

  x1、y1和x2、y2就是两个端点,从而求出了四个端点的坐标。这样一来,剪辑区域就是圈加矩形,代码组织起来就是:
XML/HTML Code复制内容到剪贴板

  1. var hastouch = "ontouchstart" in window?true:false,//判断是否为移动设备
  2. tapstart = hastouch?"touchstart":"mousedown",
  3. tapmove = hastouch?"touchmove":"mousemove",
  4. tapend = hastouch?"touchend":"mouseup";
  5. canvas.addEventListener(tapstart , function(e){
  6. e.preventDefault();
  7. x1 = hastouch?e.targetTouches[0].pageX:e.clientX-canvas.offsetLeft;
  8. y1 = hastouch?e.targetTouches[0].pageY:e.clientY-canvas.offsetTop;
  9.   //鼠标第一次点下的时候擦除一个圆形区域,同时记录第一个坐标点
  10. ctx.save()
  11. ctx.beginPath()
  12. ctx.arc(x1,y1,a,0,2*Math.PI);
  13. ctx.clip()
  14. ctx.clearRect(0,0,canvas.width,canvas.height);
  15. ctx.restore();
  16. canvas.addEventListener(tapmove , tapmoveHandler);
  17. canvas.addEventListener(tapend , function(){
  18. canvas.removeEventListener(tapmove , tapmoveHandler);
  19. });
  20.   //鼠标移动时触发该事件
  21. function tapmoveHandler(e){
  22. e.preventDefault()
  23. x2 = hastouch?e.targetTouches[0].pageX:e.clientX-canvas.offsetLeft;
  24. y2 = hastouch?e.targetTouches[0].pageY:e.clientY-canvas.offsetTop;
  25.     //获取两个点之间的剪辑区域四个端点
  26. var aasin = a*Math.sin(Math.atan((y2-y1)/(x2-x1)));
  27. var aacos = a*Math.cos(Math.atan((y2-y1)/(x2-x1)))
  28. var x3 = x1+asin;

您可能想查找下面的文章:

相关文章

  • 2018-12-03canvas在浏览器里的渲染原理?
  • 2018-12-03html5 canvas里绘制椭圆并保持线条粗细均匀的技巧_html5教程技巧
  • 2018-12-03H5和CSS3组合使用的实例教程
  • 2018-12-03豆瓣电台为什么不做 HTML5 版的播放器呢?
  • 2018-12-03 小强的HTML5移动开发之路(3)——HTML5与HTML4比较
  • 2018-12-03揭秘谷歌AMP项目:google amp是如何提高网页加载速度的?
  • 2018-12-03html5使用go+websocket搭建websocket服务的实例
  • 2017-08-06探讨HTML5移动开发的几大特性(必看)
  • 2018-12-03HTML5每日一练之Canvas标签的应用-绘制径向渐变图形
  • 2018-12-03HTML5每日一练之Canvas标签的应用-绘制向日葵

文章分类

  • html/xhtml
  • html5
  • CSS
  • XML/XSLT
  • Dreamweaver教程
  • Frontpage教程
  • 心得技巧
  • bootstrap
  • vue
  • AngularJS
  • HBuilder教程
  • css3
  • 浏览器兼容
  • div/css
  • 网页编辑器
  • axure

最近更新的内容

    • HTML5实现自定义的数字键盘?
    • html5如何插入可自动播放的音频(图文)
    • html5 更新图片颜色示例代码_html5教程技巧
    • 有人说基于成熟后的HTML5 移动web应用才是未来,因为省去了app移动应用在不同终端的开发时间。基于终端的移动应用也会走下舞台,各位怎么认为?
    • 如何解决HTML5微信播放全屏问题的方法
    • 浅谈图形扭曲的实例教程
    • HTML5 3D衣服摇摆动画特效_html5教程技巧
    • 使用javascript和HTML5 Canvas画的四渐变色播放按钮效果_html5教程技巧
    • HTML5实现购物车本地存储功能
    • SVG基础|绘制SVG直线、折线和多边形

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有