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圆角和渐变2种常用功能详解
Jan 06 HTML / CSS
CSS3 按钮边框动画的实现
Nov 12 HTML / CSS
html5 canvas里绘制椭圆并保持线条粗细均匀的技巧
Mar 25 HTML / CSS
HTML5实现获取地理位置信息并定位功能
Apr 25 HTML / CSS
Html5元素及基本语法详解
Aug 02 HTML / CSS
HTML5+CSS3模仿优酷视频截图功能示例
Jan 05 HTML / CSS
canvas如何绘制钟表的方法
Dec 13 HTML / CSS
Html5页面二次分享的实现
Jul 30 HTML / CSS
canvas中普通动效与粒子动效的实现代码示例
Jan 03 HTML / CSS
五分钟学会HTML5的WebSocket协议
Nov 22 HTML / CSS
奇妙的 CSS shapes(CSS图形)
Apr 05 HTML / CSS
CSS 实现角标效果的完整代码
Jun 28 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
PHP 和 MySQL 基础教程(四)
2006/10/09 PHP
php中引用符号(&amp;)的使用详解
2013/11/13 PHP
PHP实现查询两个数组中不同元素的方法
2016/02/23 PHP
php简单实现短网址(短链)还原的方法(测试可用)
2016/05/09 PHP
PHP+JQUERY操作JSON实例
2017/03/23 PHP
php使用socket调用http和smtp协议实例小结
2019/07/26 PHP
关于jQuery参考实例 1.0 jQuery的哲学
2013/04/07 Javascript
Eclipse下jQuery文件报错出现错误提示红叉
2014/01/13 Javascript
如何调试异步加载页面里包含的js文件
2014/10/30 Javascript
使用JQ来编写最基本的淡入淡出效果附演示动画
2014/10/31 Javascript
JavaScript中document对象使用详解
2015/01/06 Javascript
JS获取鼠标坐标并且根据鼠标位置不同弹出不同内容
2017/06/12 Javascript
vue element-ui table组件动态生成表头和数据并修改单元格格式 父子组件通信
2019/08/15 Javascript
TypeScript魔法堂之枚举的超实用手册
2020/10/29 Javascript
Python实现Windows和Linux之间互相传输文件(文件夹)的方法
2017/05/08 Python
在Python程序员面试中被问的最多的10道题
2017/12/05 Python
Python生成MD5值的两种方法实例分析
2019/04/26 Python
python验证身份证信息实例代码
2019/05/06 Python
django 环境变量配置过程详解
2019/08/06 Python
Java文件与类动手动脑实例详解
2019/11/10 Python
使用Pandas将inf, nan转化成特定的值
2019/12/19 Python
解决keras GAN训练是loss不发生变化,accuracy一直为0.5的问题
2020/07/02 Python
python实现模拟器爬取抖音评论数据的示例代码
2021/01/06 Python
iRobot官网:改变生活的家用机器人品牌
2016/09/20 全球购物
翻新二手苹果产品的网络领导者:Mac of all Trades
2017/12/19 全球购物
工程造价专业大学生自荐信
2013/10/01 职场文书
驾驶员岗位职责
2014/01/29 职场文书
党的群众路线教育实践活动心得体会900字
2014/03/07 职场文书
行政主管职责范本
2014/03/07 职场文书
公司门卫工作职责
2014/06/28 职场文书
尊老爱亲美德少年事迹材料
2014/08/14 职场文书
不服从公司安排检讨书
2014/09/24 职场文书
和谐家庭事迹材料
2014/12/20 职场文书
小学运动会加油词
2015/07/18 职场文书
python删除csv文件的行列
2021/04/06 Python
python字符串拼接.join()和拆分.split()详解
2021/11/23 Python