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中动画属性transform、transition和animation属性的区别
Sep 25 HTML / CSS
使用css3和jquery实现可伸缩搜索框
Feb 12 HTML / CSS
CSS 3.0文字悬停跳动特效代码
Oct 26 HTML / CSS
详解FireFox下Canvas使用图像合成绘制SVG的Bug
Jul 10 HTML / CSS
HTML5触摸事件演化tap事件介绍
Mar 25 HTML / CSS
html2canvas把div保存图片高清图的方法示例
Mar 05 HTML / CSS
详解移动端Html5页面中1px边框的几种解决方法
Jul 24 HTML / CSS
用canvas做一个DVD待机动画的实现代码
Apr 12 HTML / CSS
详解canvas绘制网络字体几种方法
Aug 27 HTML / CSS
浅析数据存储的三种方式 cookie sessionstorage localstorage 的异同
Jun 04 HTML / CSS
css3应用示例:新增的选择器
Mar 16 HTML / CSS
基于CSS制作创意端午节专属加载特效
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
Win2003服务器安全加固设置--进一步提高服务器安全性
2007/05/23 PHP
php 调用远程url的六种方法小结
2009/11/02 PHP
Ubuntu 16.04中Laravel5.4升级到5.6的步骤
2018/12/07 PHP
php使用lua+redis实现限流,计数器模式,令牌桶模式
2019/04/04 PHP
4种Windows系统下Laravel框架的开发环境安装及部署方法详解
2020/04/06 PHP
你必须知道的JavaScript 变量命名规则详解
2013/05/07 Javascript
js有序数组的连接问题
2013/10/01 Javascript
javascript实现按回车键切换焦点
2015/02/09 Javascript
AJAX实现瀑布流触发分页与分页触发瀑布流的方法
2016/05/23 Javascript
jquery ajax结合thinkphp的getjson实现跨域的方法
2016/06/06 Javascript
js实现京东轮播图效果
2017/06/30 Javascript
简述vue中的config配置
2018/01/23 Javascript
Angular 数据请求的实现方法
2018/05/07 Javascript
解决Vue.js父组件$on无法监听子组件$emit触发事件的问题
2018/09/12 Javascript
vue使用代理解决请求跨域问题详解
2019/07/24 Javascript
layui-tree实现Ajax异步请求后动态添加节点的方法
2019/09/23 Javascript
解决vue 表格table列求和的问题
2019/11/06 Javascript
[50:27]OG vs LGD 2018国际邀请赛淘汰赛BO3 第一场 8.26
2018/08/30 DOTA
详解Python 实现元胞自动机中的生命游戏(Game of life)
2018/01/27 Python
Python实现的合并两个有序数组算法示例
2019/03/04 Python
Django框架HttpResponse对象用法实例分析
2019/11/01 Python
pycharm双击无响应(打不开问题解决办法)
2020/01/10 Python
Python3变量与基本数据类型用法实例分析
2020/02/14 Python
使用keras根据层名称来初始化网络
2020/05/21 Python
TensorFlow keras卷积神经网络 添加L2正则化方式
2020/05/22 Python
Python爬取YY评级分数并保存数据实现过程解析
2020/06/01 Python
Python3内置函数chr和ord实现进制转换
2020/06/05 Python
linux centos 7.x 安装 python3.x 替换 python2.x的过程解析
2020/12/14 Python
经济学人订阅:The Economist
2018/07/19 全球购物
学年自我鉴定
2014/01/16 职场文书
交通安全寄语大全
2014/04/08 职场文书
活动策划求职信模板
2014/04/21 职场文书
2014年稽查工作总结
2014/12/20 职场文书
加入学生会自荐书
2015/03/05 职场文书
公诉意见书范文
2015/06/05 职场文书
小学校长开学致辞
2015/07/29 职场文书