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 完美实现圆角效果
Jul 13 HTML / CSS
CSS3图片旋转特效(360/60/-360度)
Oct 10 HTML / CSS
可自定义箭头样式的CSS3气泡提示框
Mar 16 HTML / CSS
CSS3的 fit-content实现水平居中
Sep 07 HTML / CSS
CSS3实现图片抽屉式效果的示例代码
Nov 06 HTML / CSS
你可能不熟练的十个前端HTML5经典面试题
Jul 03 HTML / CSS
使用html5 canvas创建太空游戏的示例
May 08 HTML / CSS
移动端HTML5实现文件上传功能【附代码】
Mar 25 HTML / CSS
HTML中meta标签及Keywords
Apr 15 HTML / CSS
HTML5通过navigator.mediaDevices.getUserMedia调用手机摄像头问题
Apr 27 HTML / CSS
CSS使用伪类控制边框长度的方法
Jan 18 HTML / CSS
在CSS中使用when/else的方法
Jan 18 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 加密与解密的斗争
2009/04/17 PHP
linux下为php添加curl扩展的方法
2011/07/29 PHP
php 生成自动创建文件夹并上传文件的示例代码
2014/03/07 PHP
php中stream(流)的用法
2014/03/25 PHP
PHP的Trait机制原理与用法分析
2019/10/18 PHP
JavaScript 小型打飞机游戏实现原理说明
2010/10/28 Javascript
鼠标右击事件代码(asp.net后台)
2011/01/27 Javascript
jQuery实现页面滚动时层智能浮动定位实例探讨
2013/03/29 Javascript
js 有框架页面跳转(target)三种情况下的应用
2013/04/09 Javascript
jQuery实现类似淘宝购物车全选状态示例
2013/06/26 Javascript
JavaScript中最简洁的编码html字符串的方法
2014/10/11 Javascript
Bootstrap每天必学之级联下拉菜单
2016/03/27 Javascript
彻底解决 webpack 打包文件体积过大问题
2017/07/07 Javascript
深入浅析JSONAPI在PHP中的应用
2017/12/24 Javascript
微信小程序 JS动态修改样式的实现方法
2018/12/16 Javascript
微信小程序实现录音功能
2019/11/22 Javascript
react组件基本用法示例小结
2020/04/27 Javascript
python中使用%与.format格式化文本方法解析
2017/12/27 Python
python中找出numpy array数组的最值及其索引方法
2018/04/17 Python
python抓取搜狗微信公众号文章
2019/04/01 Python
使用python爬取微博数据打造一颗“心”
2019/06/28 Python
Python爬虫 批量爬取下载抖音视频代码实例
2019/08/16 Python
python实现图像拼接功能
2020/03/23 Python
Pytorch转tflite方式
2020/05/25 Python
tensorflow 大于某个值为1,小于为0的实例
2020/06/30 Python
纯html5+css3下拉导航菜单实现代码
2013/03/18 HTML / CSS
法国春天百货官网:Printemps.com
2020/06/29 全球购物
戴尔新加坡官网:Dell Singapore
2020/12/13 全球购物
会计岗位职责范本
2014/03/07 职场文书
房产继承公证书
2014/04/09 职场文书
小学生美德少年事迹材料
2014/08/24 职场文书
房屋产权共有协议书范本
2014/11/03 职场文书
会计实训总结范文
2015/08/03 职场文书
python实现调用摄像头并拍照发邮箱
2021/04/27 Python
关于Mybatis中SQL节点的深入解析
2022/03/19 Java/Android
Python自动化实战之接口请求的实现
2022/05/30 Python