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制作半透明边框(Facebox)类似渐变
Dec 09 HTML / CSS
6种非常炫酷的CSS3按钮边框动画特效
Mar 16 HTML / CSS
详解CSS3的box-shadow属性制作边框阴影效果的方法
May 10 HTML / CSS
css3实现二维码扫描特效的示例
Oct 29 HTML / CSS
使用HTML5做个画图板的方法介绍
May 03 HTML / CSS
canvas需要在标签里直接定义宽高
Dec 17 HTML / CSS
localstorage和sessionstorage使用记录(推荐)
May 23 HTML / CSS
用canvas显示验证码的实现
Apr 10 HTML / CSS
canvas实现滑动验证的实现示例
Aug 11 HTML / CSS
浅析HTML5页面元素及属性
Jan 20 HTML / CSS
CSS实现fullpage.js全屏滚动效果的示例代码
Mar 24 HTML / CSS
如何解决flex文本溢出问题小结
Jul 15 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 什么是PEAR?
2009/03/19 PHP
PHP将回调函数作用到给定数组单元的方法
2014/08/19 PHP
php常见的魔术方法详解
2014/12/25 PHP
什么是PEAR?什么是PECL?PHP中两个容易混淆的概念解释
2015/07/01 PHP
学习php设计模式 php实现状态模式
2015/12/07 PHP
万能的php分页类
2017/07/06 PHP
通过PHP设置BugFree获取邮箱通知
2019/04/25 PHP
如何通过Apache在本地配置多个虚拟主机
2020/07/29 PHP
Javascript this指针
2009/07/30 Javascript
再谈ie和firefox下的document.all属性
2009/10/21 Javascript
jquery png 透明解决方案(推荐)
2010/08/21 Javascript
window.location.hash 使用说明
2010/11/08 Javascript
Jquery知识点一 Jquery的ready和Dom的onload的区别
2011/01/15 Javascript
基于JQuery实现鼠标点击文本框显示隐藏提示文本
2012/02/23 Javascript
jquery解决客户端跨域访问问题
2015/01/06 Javascript
基于jquery实现简单的手风琴特效
2015/11/24 Javascript
详解Vue如何支持JSX语法
2017/11/10 Javascript
vue 左滑删除功能的示例代码
2019/01/28 Javascript
使用 node.js 模仿 Apache 小部分功能
2019/07/07 Javascript
实现一个 Vue 吸顶锚点组件方法
2019/07/10 Javascript
node.js文件的复制、创建文件夹等相关操作
2021/02/05 Javascript
[01:03:41]完美世界DOTA2联赛PWL S3 DLG vs Phoenix 第一场 12.17
2020/12/19 DOTA
[50:02]完美世界DOTA2联赛PWL S2 Magma vs FTD 第三场 11.29
2020/12/03 DOTA
python传递参数方式小结
2015/04/17 Python
Python中List.index()方法的使用教程
2015/05/20 Python
使用PyQtGraph绘制精美的股票行情K线图的示例代码
2019/03/14 Python
浅谈pandas.cut与pandas.qcut的使用方法及区别
2020/03/03 Python
Python 如何对文件目录操作
2020/07/10 Python
Python内置函数property()如何使用
2020/09/01 Python
Pytho爬虫中Requests设置请求头Headers的方法
2020/09/22 Python
用HTML5的canvas实现一个炫酷时钟效果
2016/05/20 HTML / CSS
KTV的创业计划书范文
2014/02/02 职场文书
幼儿园教师教育感言
2014/02/28 职场文书
公司任命书范本
2014/06/04 职场文书
教师工作能力自我评价
2015/03/04 职场文书
python爬虫之selenium库的安装及使用教程
2021/05/23 Python