javascript - HTML5 Canvas绘画应用如何实现拖拽?

标签 javascript html canvas drag-and-drop html5-canvas

基于 Creating an HTML 5 canvas painting application我创建了一个 HTML5 Canvas 绘画应用程序。它工作正常,但在创建每个对象后我只需要拖动对象。 Working demo

如何实现图形的拖放?

最佳答案

当用户在 Canvas 上单击时,您必须检查坐标(将其与对象的坐标进行比较),并查看它是否在对象上。例如。您可以使用此方法测试一个点(例如 mousedown 的坐标)是否在圆内:

function (pt) {
    return Math.pow(pt.x - point.x,2) + Math.pow(pt.y - point.y,2) < 
                                                             Math.pow(radius,2); 
};

如果 mousedown 在对象上,则必须根据鼠标的移动方式更改对象坐标。

这是一个示例,您可以在其中拖动一个圆圈:

<!DOCTYPE html>
<html>
<head>
<script>
window.onload = function() {
    drawCircle(circle);
    element = document.getElementById('canvas');
    element.addEventListener('mousedown', startDragging, false);
    element.addEventListener('mousemove', drag, false);
    element.addEventListener('mouseup', stopDragging, false);
    element.addEventListener('mouseout', stopDragging, false);
}

function mouseX(e) {
return e.clientX - element.offsetLeft;
}

function mouseY(e) {
return e.clientY - element.offsetTop;
}

var Point = function (x, y) {
    this.x = x;
    this.y = y;
    return this;
}

var Circle = function (point, radius) {
    this.point = point;
    this.radius = radius;
    this.isInside = function (pt) {
        return Math.pow(pt.x - point.x, 2) + Math.pow(pt.y - point.y, 2) <
                                                          Math.pow(radius, 2); 
    };
    return this;
}

function startDragging(e) {
    var p = new Point(e.offsetX, e.offsetY);
    if(circle.isInside(p)) {
        deltaCenter = new Point(p.x - circle.point.x, p.y - circle.point.y);
    }
}

function drag(e) {
    if(deltaCenter != null) {
        circle.point.x = (mouseX(e) - deltaCenter.x);
        circle.point.y = (mouseY(e) - deltaCenter.y);   
        drawCircle(circle);
    }
}

function stopDragging(e) {
    deltaCenter = null;
}

function drawCircle(circle) {
    var canvas = document.getElementById('canvas');
    var ctx = canvas.getContext('2d');
    ctx.clearRect(0, 0, canvas.width, canvas.height);
    ctx.beginPath();
    ctx.arc(circle.point.x, circle.point.y, circle.radius, 0, Math.PI*2, true);
    ctx.fill();
}

var circle = new Circle(new Point(30, 40), 25);
var deltaCenter = null;
var element;

</script>
</head>
<body>
<canvas id="canvas" width="400" height="300"></canvas>
</body>
</html>

试试jsFiddle

关于javascript - HTML5 Canvas绘画应用如何实现拖拽?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8403744/

相关文章:

javascript - 如何在其中的段落达到 500px 高度后将 div 的高度 (500px) 更改为自动?

javascript - 如何在 jQuery 和 SASS 中制作一个轻轻闪烁的按钮?

javascript - 渐进式网页应用。 Service Worker 通知出现多次

javascript - 在 mozilla canvas 中拖放

canvas - 图像未加载到 Canvas 上

javascript - 条件不起作用,仍在提交表单

javascript - 无法识别的帧操作码 : 5 and web socket closes

php - 使用PHP将多选表单中的数据存储到MYSQL

html - MySQL 存储大型 WYSIWYG 字段(例如 140668 个字符)的最佳方式

javascript - 通过 JavaScript 函数将文本写入 Canvas