【问题标题】:Mouse Coords over Multiple Canvases HTML5/Javascript多个画布上的鼠标坐标 HTML5/Javascript
【发布时间】:2013-01-02 19:12:29
【问题描述】:

我正在尝试使用 2 个画布,我希望它们都接受放入其中的图像并使用鼠标单击来操作图像。这是我正在处理的代码。

我有它,如果我只有“droppedImage”画布的事件监听器,它就可以正常工作,只要我为“changeImage”画布放入处理程序,它就会看到第二个画布并将坐标报告为第一个画布不再显示 RGB 值或更改第三个画布“selectedColour”的背景

在我上床睡觉时发布此内容,如果有人给出答案或需要更多信息,我会在明天工作更新前弹出。

window.onload = function() {
    var droppedImage = document.getElementById("droppedImage"),
        ctx = droppedImage.getContext("2d");
    droppedImage.addEventListener("mouseup", mpos);
        // init event handlers
    droppedImage.addEventListener("dragenter", dragEnter, false);
    droppedImage.addEventListener("dragexit", dragExit, false);
    droppedImage.addEventListener("dragover", dragOver, false);
    droppedImage.addEventListener("drop", drop, false);

        var changeImage = document.getElementById("changeImage"),
        ctx = changeImage.getContext("2d");
    changeImage.addEventListener("mouseup", mpos);
    // init event handlers
    changeImage.addEventListener("dragenter", dragEnter, false);
    changeImage.addEventListener("dragexit", dragExit, false);
    changeImage.addEventListener("dragover", dragOver, false);
    changeImage.addEventListener("drop", drop, false);

    var selectedColour = document.getElementById("selectedColour");

function dragEnter(evt) {
    evt.stopPropagation();
    evt.preventDefault();
}

function dragExit(evt) {
    evt.stopPropagation();
    evt.preventDefault();
}

function dragOver(evt) {
    evt.stopPropagation();
    evt.preventDefault();
}

function drop(evt) {
    evt.stopPropagation();
    evt.preventDefault();

    var files = evt.dataTransfer.files;
    var count = files.length;

    // Only call the handler if 1 or more files was dropped.
    if (count >0)   
        importImage(files);
}




function mpos(e) {
    var cX = 0,
        cY = 0;

    if (event.pageX || event.pageY) {
        cX = event.pageX;
        cY = event.pageY;
    }
    else {
        cX = event.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
        cY = event.clientY + document.body.scrollTop + document.documentElement.scrollTop;
    }

    cX -= droppedImage.offsetLeft;
    cY -= droppedImage.offsetTop;

   // ctx.fillRect(cX, cY, 2, 2);

   alert("X co-ord : "+ cX +", Y co-ord : "+ cY);
   var imageData = ctx.getImageData(cX, cY, 1, 1);
   alert("Pixel 1: "+ imageData.data[0]+", "+imageData.data[1]+", "+ imageData.data[2]+", "+ imageData.data[3]);
   selectedColour.style.backgroundColor = "rgb("+imageData.data[0]+","+imageData.data[1]+","+imageData.data[2]+")";

}
}


function importImage(files) {

    var file = files[0];
    var reader = new FileReader;
    reader.onloadend = handleReaderLoadEnd; 
    reader.readAsDataURL(file);



function handleReaderLoadEnd(evt){     


    var canvas = document.getElementsByTagName('canvas')[0];
    var ctx = canvas.getContext('2d');
    var img = new Image;
        img.src = event.target.result;          
        img.onload = function() {       
        width = img.width;
        height = img.height;        
        var scaleX, scaleY, scale;
        var scaledWidth, scaledHeight;
        scaleX = width / canvas.width;
        scaleY = height / canvas.height;
        scale = scaleX > scaleY ? scaleX : scaleY;
        scaledWidth = width / scale;
        scaledHeight = height / scale;
        ctx.clearRect(0,0, canvas.width, canvas.height);
        ctx.drawImage(img, (canvas.width - scaledWidth) / 2, (canvas.height - scaledHeight) / 2, scaledWidth, scaledHeight);

        }
    }


}

【问题讨论】:

    标签: javascript html canvas html5-canvas dom-events


    【解决方案1】:

    理论上,如果您有两组画布并向它们添加事件侦听器,那么两组事件侦听器将在设计上同时触发。最好有一个附加了事件侦听器的画布,然后检测鼠标坐标并操纵正在单击的图像。请记住,您不能在画布内的绘制精灵上使用单击处理程序,只能在画布本身上使用;您检查鼠标坐标是否在绘制的精灵内。

    在您的场景中,我会简单地复制放入的图像并将其传递给第二个画布元素。我假设您正在做某种二合一图像编辑应用程序;在这种情况下,我将在左侧有一个“拖放区”供图像进入,然后它会出现在右侧,可编辑。然后只在一个画布上使用点击处理程序。我在this thread 中也对此有更多想法。

    【讨论】:

    • 我明天会研究一下,看看我的进展如何,谢谢你的帮助。
    • 嗨,Ben,我正在开发两个图像编辑类型的应用程序,但它将是两个不同的图像。所以我认为我需要有 2 个单独的画布,因为图像将动态缩放以显示在浏览器中。我没有将图像上传到服务器。我能想到的唯一另一种方法是,如果我有一个大画布并尝试控制与画布内选定大小/区域相关的缩放。这听起来更可行吗?感谢您的帮助
    • 你可以做的是每张图片有一个画布;然后是第三个画布来处理所有其他绘图和事件功能。第一次放置图像时,它会放在一个画布上,第二次放在第二个画布上。使用 CSS 将画布与 position:absolute 和 z-index 放在一起。希望对您有所帮助。
    • 所以,Ben 你是说我要把我的 2 张图片并排放在第三张画布上,这应该与两张图片合并后的大小相同,并且可以容纳所有事件处理程序?因此,理论上,如果发生单击,您正在检查第三个画布上的一个区域,该区域与单击区域上方的任何画布直接相关?所以这意味着接受点击的坐标并根据位置采取行动?对不起,我的吸收有点慢。谢谢你的建议。
    • 是的,完全正确。由于画布只是在屏幕上绘制图形的一种方式,因此每当您想添加一些交互时,您都需要计算鼠标相对于画布元素的坐标。
    猜你喜欢
    • 2014-08-27
    • 2012-02-11
    • 1970-01-01
    • 1970-01-01
    • 2011-10-15
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    相关资源
    最近更新 更多