Canvas:橡皮筋线条绘制

Canvas:橡皮筋线条绘制

效果演示

实现要点

事件监听

【说明】:

在Canvas中检测鼠标事件是非常简单的,可以在canvas中添加一个事件监听器,当事件发生时,浏览器就会调用这个监听器。

我们可以使用绑定事件属性:

canvas.onmousedown = function(e)
{
   //.....
}  

此外,也可以使用更为通用的addEventListener()方法来注册监听器:

canvas.addEventListener(‘mousedown‘,function(e){
   //.....
})  

注意:使用onmouseXXX更为简单,但是addEventListener()可以向某个事件注册多个监听器。

鼠标坐标转换为canvas坐标

【说明】

  浏览器通过事件对象传递给监听器的鼠标坐标,是窗口坐标,而不是相对于canvas自身的坐标。大部分情况下,我们需要知道的是发生鼠标事件的点相对于canvas的位置,而不是在整个窗口中的坐标,所以必须进行坐标转换

【实例】:转换代码

    function windowToCanvas(x, y) {
        var bbox = canvas.getBoundingClientRect();
        return {
            x: (x - bbox.left)*(canvas.width / bbox.width),
            y: (y - bbox.top)*(canvas.height / bbox.height)
        };
    }

注意:为什么最后要乘(canvas.width / bbox.width),我们简单说明一下,canvas存在元素大小与绘图表面大小两套尺寸,我们的图像是显示在绘图表面上的,但是如果canvas元素大小较大的话,浏览器就会对绘图表面上的图像进行缩放以适应canvas元素大小,我们要避免这种缩放就要除去缩放比例

我们用element表示canvas元素,用canvas表示绘图表面,src表示绘制的内容,dest表示展示的内容

缩放规则为:dest.size = src.size * (element.size / canvas.size)

所以,src=dest.size*(canvas.size/element.size)

绘制表面的保存与恢复

【说明】:

  使用getImageData与putImageData方法来保存与恢复绘图环境的绘图表面数据。

【实例】:保存和恢复数据

    function saveDrawingSurface() {
        drawingSurfaceImageData = context.getImageData(0, 0, canvas.width, canvas.height);
    }

    function restoreDrawingSurface() {
        context.putImageData(drawingSurfaceImageData, 0, 0);
    }  

实现代码

<canvas id="canvas"></canvas>

<div id="controls">
    <select id="strokeStyleSelect">
        <option value="red">red</option>
        <option value="green">green</option>
        <option value="blue">blue</option>
    </select>
</div>
GuideWires:
<input id="guidewireCheckbox" type="checkbox" checked>
<input id="eraseAllButton" type="button" value="Erase All">

<script type="text/javascript">
    var canvas = document.getElementById("canvas");
    var context = canvas.getContext(‘2d‘);
    var eraseAllButton = document.getElementById("eraseAllButton");
    var strokeStyleSelect = document.getElementById("strokeStyleSelect");
    var guidewireCheckbox = document.getElementById("guidewireCheckbox");
    var drawingSurfaceImageData;
    var mousedown = {};
    var rubberbandrect = {};
    var dragging = false;
    guidewires = guidewireCheckbox.checked;

    function windowToCanvas(x, y) {
        var bbox = canvas.getBoundingClientRect();
        return {
            x: (x - bbox.left)* (canvas.width / bbox.width),
            y: (y - bbox.top)* (canvas.height / bbox.height)
        };
    }

    function saveDrawingSurface() {
        drawingSurfaceImageData = context.getImageData(0, 0, canvas.width, canvas.height);
    }

    function restoreDrawingSurface() {
        context.putImageData(drawingSurfaceImageData, 0, 0);
    }

    function updateRubberbandRectangle(loc) {
        rubberbandrect.width = Math.abs(loc.x - mousedown.x);
        rubberbandrect.height = Math.abs(loc.y - mousedown.y);
        if (loc.x > mousedown.x)
            rubberbandrect.left = mousedown.x;
        else
            rubberbandrect.left = loc.x;
        if (loc.y > mousedown.y)
            rubberbandrect.top = mousedown.y;
        else
            rubberbandrect.top = loc.y;
    }

    function drawRubberbandShape(loc) {
        context.beginPath();
        context.moveTo(mousedown.x, mousedown.y);
        context.lineTo(loc.x, loc.y);
        context.stroke();
    }

    function updateRubberband(loc) {
        updateRubberbandRectangle(loc);
        drawRubberbandShape(loc);
    }

    canvas.onmousedown = function (e) {
        var loc = windowToCanvas(e.clientX, e.clientY);
        e.preventDefault();
        saveDrawingSurface();
        mousedown.x = loc.x;
        mousedown.y = loc.y;
        dragging = true;
    };

    canvas.onmousemove = function (e) {
        var loc;
        if (dragging) {
            e.preventDefault();
            loc = windowToCanvas(e.clientX, e.clientY);
            restoreDrawingSurface();
            updateRubberband(loc);
        }
    };

    canvas.onmouseup = function (e) {
        loc = windowToCanvas(e.clientX, e.clientY);
        restoreDrawingSurface();
        updateRubberband(loc);
        dragging = false;
    };
    context.strokeStyle = "red";
</script>

原文地址:https://www.cnblogs.com/MrSaver/p/10011453.html

时间: 2024-11-08 20:16:12

Canvas:橡皮筋线条绘制的相关文章

HTML5 Canvas ( 线段的绘制 ) beginPath, moveTo, strokeStyle, stroke

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>canvas</title> <script type="text/javascript" src="../js/jQuery.js"></script> <style type="text/css">

千呼万唤 HTML 5 (8) - 画布(canvas)之绘制图形

[索引页][源码下载] 作者:webabcd 介绍HTML 5: 画布(canvas)之绘制图形 画布 Demo - 画布的基本概念及 Demo,canvas.getContext(), CanvasRenderingContext2D, canvas.width, canvas.height, canvas.toDataURL() 在画布上绘制矩形 - canvas.getContext(), fillRect(), fillStyle, lineWidth, strokeStyle, str

canvas教程(三) 绘制曲线

经过 canvas 教程(二) 绘制直线 我们知道了 canvas 的直线是怎么绘制的 而本次是给大家带来曲线相关的绘制 绘制圆形 在 canvas 中我们可以使用 arc 方法画一个圆 context.beginPath(); context.arc(x, y, r, startRadian, endRadian, antclockwise); context.closePath(); 我们是第一次用到 beginPath 和 closePath 这两个方法,首先这两个方法故名思意就是开始路径

Quartz2D简介及基本线条绘制

* Quartz2D简介 1.什么是Quartz2D? 他是一个二维的绘图引擎,同时支持iOS和Mac系统 2.Quartz2D能完成的工作 画基本线条,绘制文字,图片,截图,自定义UIView. 3.Quartz2D在开发中的价值 当我们的控件样式极其复杂时,可以把控件内部的结构给画出画,就是自定义控件. 5.什么是图形上下文,上下文的类型有哪些? 图形上下文是用来保存用户绘制的内容状态,并决定绘制到哪个地方的. 用户把绘制好的内容先保存到图形上下文, 然后根据选择的图形上下文的不同,绘制的内

如何在html5的canvas画布中绘制gif动态图片

我们都知道如何在html5的canvas画布上绘制静态图片(jpeg, png等),直接用canvas中的drawImage方法即可,那么如何绘制动态图片(gif)? 相信大家都知道动态图片之所以动态,是因为它是由很多图片按一定的帧数顺序播放而成的,因此我们是否也可以模拟这样的帧数,每隔一定的时间重新 绘制图片,就能画出动态图片呢?答案当然是YES.下面就是我自己测试的一个例子,代码如下: 1 <!DOCTYPE HTML> 2 <html> 3 <head> 4 &l

HTML5中canvas元素,绘制圆形

HTML5中canvas元素,绘制圆形需要使用路径,开始时要取得图形上下文,首先使用路径来勾勒图形的轮廓,然后设置颜色,进行绘制. <!DOCTYPE html> <head> <meta charset="UTF-8" /> <script>     function draw(id) {         var canvas = document.getElementById(id);         if (canvas == nu

Canvas 中drawImage 绘制不出图片

在使用Canvas的drawImage绘制图片时,却发现绘制不出图片,原因是图片是异步加载,图片加载完再绘制. //html <img src="1.png" /> <canvas id="draw"></canvas> //js var Image = document.images[0]; var draw = document.getElementById('draw'); var context = draw.getCon

canvas设置线条样式

canvas设置线条样式 合法属性和方法 lineWidth = value 设置线宽 lineCap = type 设置线端点样式 lineJoin = type 设置线交合处样式 setLineDash(segments) 设置虚线 lineDashOffset = value 设置虚线偏移 设置线宽 const canvas = document.getElementById('canvas'); const ctx = canvas.getContext('2d'); ctx.lineW

canvas详解----绘制线条

<!DOCTYPE html> <html> <head> <title>canvas详解</title> </head> <body> <canvas id="canvas" width="1024" height="768" style="border:1px solid #aaa;display:block;margin:50 auto;&q