【问题标题】:make canvas image movable ( draggable )使画布图像可移动(可拖动)
【发布时间】:2016-01-10 02:29:36
【问题描述】:

我有一个画布区域,我正在向其中添加一些图像,我想让我的画布图像可拖动。我已经通过 addEventListener 创建了鼠标事件来处理鼠标点击。
但我的问题是我能够使所有画布上下文都可拖动,而不仅仅是我的图像。

html代码:

<canvas></canvas>

部分JS代码:

var canvas = document.getElementsByTagName('canvas')[0];
var gkhead = new Image;
var ball   = new Image;
ctx.drawImage(gkhead,0,0,1000, 200);
ctx.drawImage(ball,0,0,100,100);

canvas.addEventListener('mousedown',function(evt){
        document.body.style.mozUserSelect = document.body.style.webkitUserSelect = document.body.style.userSelect = 'none';
        lastX = evt.offsetX || (evt.pageX - canvas.offsetLeft);
        lastY = evt.offsetY || (evt.pageY - canvas.offsetTop);
        dragStart = ctx.transformedPoint(lastX,lastY);
        dragged = false;
    },false);

canvas.addEventListener('mousemove',function(evt){
        lastX = evt.offsetX || (evt.pageX - canvas.offsetLeft);
        lastY = evt.offsetY || (evt.pageY - canvas.offsetTop);
        dragged = true;
        if (dragStart){
            var pt = ctx.transformedPoint(lastX,lastY);
            ctx.translate(pt.x-dragStart.x,pt.y-dragStart.y);
            redraw();
        }
    },false);

canvas.addEventListener('mouseup',function(evt){
        dragStart = null;
        if (!dragged) zoom(evt.shiftKey ? -1 : 1 );
    },false);

是否有可能使第一张图像( gkhead )仅在画布区域中可移动,而第二张(球)图像仅在第一张( gkhead )图像区域中可移动?
HERE is my fiddle
谢谢大家的建议。

【问题讨论】:

    标签: javascript html jquery-ui jcanvas


    【解决方案1】:

    为了提高效率,您可以设置两个相同大小的独立画布层。一个包含所有画布对象,另一个是空白的临时画布,您将在其中进行对象的实际移动。

    您还需要将图像存储在某种容器中,例如 JSON-y 对象。所以你会有一些参考,比如 x 和 y 坐标、图像源、图像的宽度、图像的高度,可能还有图像的 z 索引。您将创建某种命中检测来检查所有图像,如果用户单击图像,则从主画布中删除该图像。在临时画布上完全相同的位置绘制图像。在临时画布上进行所有拖动(以节省绘画时间和所需的处理)。然后,在放置时,擦除临时画布并再次在主画布上绘制。

    这是我很久以前做的一个例子(just code,抱歉)。现在正在尝试找到一些有关它的在线教程。

    【讨论】:

    • " 一个上面绘制了所有画布对象,另一个是空白的临时画布,您将在其中进行对象的实际移动" - 什么样的效率是通过这个实现的..?据我所知,这也产生了必须在不同的画布上创建和绘制东西的开销
    • 如果你的画布上有很多对象,它可能只会变得更有效率。因此,不是每次刷新都重绘 100 个对象,而是只重绘一次主画布,以移除您正在移动的对象,然后在移动过程中重绘临时画布,节省在移动过程中重绘其他一百个对象。
    猜你喜欢
    • 2014-01-10
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-07
    • 2016-01-03
    • 2013-01-11
    相关资源
    最近更新 更多