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 实现footer 固定在底部(无论页面多高始终在底部)
Oct 15 HTML / CSS
css3实现二维码扫描特效的示例
Oct 29 HTML / CSS
html5服务器推送_动力节点Java学院整理
Jul 12 HTML / CSS
html5文本内容_动力节点Java学院整理
Jul 11 HTML / CSS
HTML高亮关键字的实现代码
Oct 22 HTML / CSS
探究 canvas 绘图中撤销(undo)功能的实现方式详解
May 17 HTML / CSS
html5拍照功能实现代码(htm5上传文件)
Dec 11 HTML / CSS
Html5大文件断点续传实现方法
Dec 05 HTML / CSS
html5 canvas绘制网络字体的常用方法
Aug 26 HTML / CSS
做一个能自适应高度的textarea的示例代码
Sep 06 HTML / CSS
AmazeUI中各种的导航式菜单与解决方法
Aug 19 HTML / CSS
CSS 还能这样玩?奇思妙想渐变的艺术
Apr 27 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
咖啡店都有些什么常规豆子呢?有什么风味在里面
2021/03/04 咖啡文化
推荐php模板技术[转]
2007/01/04 PHP
需要使用php模板的朋友必看的很多个顶级PHP模板引擎比较分析
2008/05/26 PHP
php array_flip() 删除数组重复元素
2009/01/14 PHP
PHP中使用file_get_contents抓取网页中文乱码问题解决方法
2014/12/17 PHP
php 下 html5 XHR2 + FormData + File API 上传文件操作实例分析
2020/02/28 PHP
js 纯数字不重复排列的另类方法
2010/07/17 Javascript
jQuery 源码分析笔记(6) jQuery.data
2011/06/08 Javascript
40个有创意的jQuery图片、内容滑动及弹出插件收藏集之一
2011/12/31 Javascript
Javascript中各种trim的实现详细解析
2013/12/10 Javascript
jquery获取tr并更改tr内容示例代码
2014/02/13 Javascript
推荐9款炫酷的基于jquery的页面特效
2014/12/07 Javascript
Javascript中实现trim()函数的两种方法
2015/02/04 Javascript
js图片卷帘门导航菜单特效代码分享
2015/09/10 Javascript
JS非Alert实现网页右下角“未读信息”效果弹窗
2015/09/26 Javascript
Bootstrap中的表单验证插件bootstrapValidator使用方法整理(推荐)
2016/06/21 Javascript
AngularJS 输入验证详解及实例代码
2016/07/28 Javascript
JavaScript中setTimeout的那些事儿
2016/11/14 Javascript
JS全角与半角转化实例(分享)
2017/07/04 Javascript
vue引入ueditor及node后台配置详解
2018/01/03 Javascript
微信小程序chooseImage的用法(从本地相册选择图片或使用相机拍照)
2018/08/22 Javascript
python 输出一个两行字符的变量
2009/02/05 Python
Python3.x和Python2.x的区别介绍
2013/02/12 Python
关于你不想知道的所有Python3 unicode特性
2014/11/28 Python
如何在sae中设置django,让sae的工作环境跟本地python环境一致
2017/11/21 Python
python多进程实现进程间通信实例
2017/11/24 Python
python回调函数中使用多线程的方法
2017/12/25 Python
PyQt实现界面翻转切换效果
2018/04/20 Python
python写入数据到csv或xlsx文件的3种方法
2019/08/23 Python
python或C++读取指定文件夹下的所有图片
2019/08/31 Python
CSS3制作半透明边框(Facebox)类似渐变
2012/12/09 HTML / CSS
销售工作人员的自我评价分享
2013/11/10 职场文书
电气专业推荐信范文
2013/11/18 职场文书
优秀共产党员演讲稿
2014/09/04 职场文书
2016年教师师德师风承诺书
2016/03/25 职场文书
Python实现随机生成迷宫并自动寻路
2021/06/13 Python