canvas 橡皮筋式线条绘图应用方法


Posted in HTML / CSS onFebruary 13, 2019

什么叫橡皮筋式

指画图时橡皮筋一样伸缩自如。。

例子如下:point_down:

canvas 橡皮筋式线条绘图应用方法

思路

思路很简单,只有橡皮筋式绘制功能要注意,以下总结mousedown,mousemove,mouseup三个阶段的思路

mousedown:记录start位置,drag(记录是否处于拖动状态)设置为true,getImageData( 橡皮筋效果关键1 )

mousemove:获取拖动时的位置pos,putImageData( 对应getImageData,橡皮筋效果关键2 ),根据pos与start画直线

mouseup:drag恢复为false

关键 就在于putImageData()与getImageData()这两个canvas的方法,putImageData()记录了鼠标点下时的图像,getImageData()对应还原。如果没有执行这两个方法就会出现以下的效果

canvas 橡皮筋式线条绘图应用方法

putImageData()相当于把“扫描”出来的线都擦掉

代码

<canvas id="canvas" width="600" height="400" style="border: 1px solid black;"> </canvas>
    <script type="text/javascript">
        let canvas = document.getElementById('canvas'),
            ctx = canvas.getContext('2d'),
            canvasLeft = canvas.getBoundingClientRect().left, //getBoundingClientRect()获取元素位置
            canvasTop = canvas.getBoundingClientRect().top;
        let imageData; //记录图像数据
        let start = new Map([['x',null],['y',null]]);
        let drag = false;//记录是否处于拖动状态
        canvas.onmousedown = function (e) {
            let pos = positionInCanvas(e, canvasLeft, canvasTop);
            start.set('x', pos.x);
            start.set('y', pos.y);
            drag = true;
            //记录imageData
            imageData = ctx.getImageData(0,0,canvas.width,canvas.height);
        }
        canvas.onmousemove = function (e) {
            if(drag === true){
               let pos = positionInCanvas(e, canvasLeft, canvasTop);
               //相当于把扫描出来的线都擦掉,重新画
               ctx.putImageData(imageData, 0, 0);
               ctx.beginPath();
               ctx.moveTo(start.get('x'), start.get('y'));
               ctx.lineTo(pos.x, pos.y);
               ctx.stroke();
            }

        }
        canvas.onmouseup = function  (e) {
            drag = false;
        }
        function positionInCanvas (e, canvasLeft, canvasTop) {//获取canvas中鼠标点击位置
         return {
                  x:e.clientX - canvasLeft,
                  y:e.clientY - canvasTop
          }       
        }    

    </script>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

HTML / CSS 相关文章推荐
css3 按钮 利用css3实现超酷下载按钮
Mar 18 HTML / CSS
CSS3,线性渐变(linear-gradient)的使用总结
Jan 09 HTML / CSS
Canvas 文字碰撞检测并抽稀的方法
May 27 HTML / CSS
HTML5是否真的可以取代Flash
Feb 10 HTML / CSS
input file上传文件样式支持html5的浏览器解决方案
Nov 14 HTML / CSS
用HTML5实现网站在windows8中贴靠的方法
Apr 21 HTML / CSS
使用HTML5拍照示例代码
Aug 06 HTML / CSS
HTML5 在canvas中绘制文本附效果图
Jun 23 HTML / CSS
HTML5头部标签的一些常用信息小结
Oct 23 HTML / CSS
手把手教你实现一个canvas智绘画板的方法
Mar 04 HTML / CSS
video下autoplay属性无效的解决方法(添加muted属性)
May 19 HTML / CSS
HTML5之高度塌陷问题的解决
Jun 01 HTML / CSS
Canvas系列之滤镜效果
Feb 12 #HTML / CSS
canvas学习总结三之绘制路径-线段
Jan 31 #HTML / CSS
移动端Html5中百度地图的点击事件
Jan 31 #HTML / CSS
Html5页面内使用JSON动画的实现
Jan 29 #HTML / CSS
HTML5拍照和摄像机功能实战详解
Jan 24 #HTML / CSS
解锁canvas导出图片跨域的N种姿势小结
Jan 24 #HTML / CSS
详解canvas绘制多张图的排列顺序问题
Jan 21 #HTML / CSS
You might like
教你如何把一篇文章按要求分段
2006/10/09 PHP
php中支持多种编码的中文字符串截取函数!
2007/03/20 PHP
php学习笔记 [预定义数组(超全局数组)]
2011/06/09 PHP
深入解析PHP中逗号与点号的区别
2013/08/05 PHP
THINKPHP内容分页代码分享
2015/01/14 PHP
PHP isset()与empty()的使用区别详解
2017/02/10 PHP
JScript的条件编译
2007/05/29 Javascript
Javascript的常规数组和关联数组对比小结
2012/05/24 Javascript
javaScript让文本框内的最后一个文字的后面获得焦点实现代码
2013/01/06 Javascript
JS实现简单的二维矩阵乘积运算
2016/01/26 Javascript
javascript瀑布流式图片懒加载实例
2020/06/28 Javascript
EasyUI创建对话框的两种方式
2016/08/23 Javascript
常用js,css文件统一加载方法(推荐) 并在加载之后调用回调函数
2016/09/23 Javascript
微信小程序 教程之模块化
2016/10/17 Javascript
JavaScript中数组Array方法详解
2017/02/27 Javascript
详解Vuejs2.0 如何利用proxyTable实现跨域请求
2017/08/03 Javascript
swiper在vue项目中loop循环轮播失效的解决方法
2018/09/15 Javascript
微信小程序时间戳转日期的详解
2019/04/30 Javascript
python实现在pickling的时候压缩的方法
2014/09/25 Python
详解Django+uwsgi+Nginx上线最佳实战
2019/03/14 Python
Python实现12306火车票抢票系统
2019/07/04 Python
python单例模式原理与创建方法实例分析
2019/10/26 Python
Python3.7 读取 mp3 音频文件生成波形图效果
2019/11/05 Python
python使用ctypes调用扩展模块的实例方法
2020/01/28 Python
python3中数组逆序输出方法
2020/12/01 Python
绝对令人的惊叹的CSS3折叠效果(3D效果)整理
2012/12/30 HTML / CSS
四方通行旅游网:台湾订房、出国旅游
2017/09/20 全球购物
后勤部长岗位职责
2013/12/14 职场文书
党务公开方案
2014/05/06 职场文书
国家税务局领导班子对照检查材料思想汇报
2014/10/04 职场文书
法定代表人授权委托书范本
2014/10/07 职场文书
事业单位年度考核个人总结
2015/02/12 职场文书
安全保证书格式
2015/02/28 职场文书
如何写辞职信
2015/05/13 职场文书
指导教师推荐意见
2015/06/05 职场文书
CentOS7和8下安装Maven3.8.4
2022/04/07 Servers