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代码实现的动画导航
Oct 31 HTML / CSS
使用CSS3设计地图上的雷达定位提示效果
Apr 05 HTML / CSS
浅谈css3中的渐进增强和优雅降级
Dec 01 HTML / CSS
CSS3选择器新增问题的实现
Jan 21 HTML / CSS
微信浏览器取消缓存的方法
Mar 28 HTML / CSS
HTML最新标准HTML5总结(必看)
Jun 13 HTML / CSS
html5 input输入实时检测以及延时优化
Jul 18 HTML / CSS
HTML5 input新增type属性color颜色拾取器的实例代码
Aug 27 HTML / CSS
data:image data url 文件转为Blob上传后端的方法
Jul 16 HTML / CSS
html5移动端价格输入键盘的实现
Sep 16 HTML / CSS
Html5写一个简单的俄罗斯方块小游戏
Dec 03 HTML / CSS
如何利用 CSS Overview 面板重构优化你的网站
Oct 24 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 $_SERVER[&quot;REQUEST_URI&quot;]获取值的通用解决方法
2010/06/21 PHP
ThinkPHP利用PHPMailer实现邮件发送实现代码
2013/09/26 PHP
php 生成自动创建文件夹并上传文件的示例代码
2014/03/07 PHP
Opcache导致php-fpm崩溃nginx返回502
2015/03/02 PHP
PHP随机数 C扩展随机数
2016/05/04 PHP
php实现记事本案例
2020/10/20 PHP
js一般方法改写成面向对象方法的无限级折叠菜单示例代码
2013/07/04 Javascript
JS中window.open全屏命令解析及使用示例
2013/12/11 Javascript
jquery中object对象循环遍历的方法
2015/12/18 Javascript
js中利用tagname和id获取元素的方法
2016/01/03 Javascript
Jquery-data的三种用法
2017/04/18 jQuery
vue小图标favicon不显示的解决方案
2017/09/19 Javascript
实现一个 Vue 吸顶锚点组件方法
2019/07/10 Javascript
JS浏览器BOM常见操作实例详解
2020/04/27 Javascript
JavaScript随机数的组合问题案例分析
2020/05/16 Javascript
详解Node.js使用token进行认证的简单示例
2020/05/25 Javascript
vue 递归组件的简单使用示例
2021/01/14 Vue.js
Nodejs实现微信分账的示例代码
2021/01/19 NodeJs
[47:08]OG vs INfamous 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
[45:34]完美世界DOTA2联赛PWL S3 Rebirth vs CPG 第一场 12.18
2020/12/19 DOTA
python 判断一个进程是否存在
2009/04/09 Python
python中split方法用法分析
2015/04/17 Python
1 行 Python 代码快速实现 FTP 服务器
2018/01/25 Python
Django框架模板用法入门教程
2019/11/04 Python
编写python代码实现简单抽奖器
2020/10/20 Python
HTML5制作酷炫音频播放器插件图文教程
2014/12/30 HTML / CSS
ASOS英国官网:英国在线时装和化妆品零售商
2017/05/19 全球购物
美容师的职业规划书
2013/12/27 职场文书
预备党员表决心书
2014/03/11 职场文书
2014大学生职业生涯规划书最新范文
2014/09/13 职场文书
庆祝教师节标语
2014/10/09 职场文书
2014大学生学生会工作总结
2014/12/19 职场文书
房屋产权证明书
2015/06/19 职场文书
python实现简单区块链结构
2021/04/25 Python
在Java中Collection的一些常用方法总结
2021/06/13 Java/Android
Java实现二维数组和稀疏数组之间的转换
2021/06/27 Java/Android