【问题标题】:how to get mouse coordinate after transform变换后如何获取鼠标坐标
【发布时间】:2012-10-23 22:57:59
【问题描述】:

如何在画布平移和缩放后获得鼠标单击图像的 x 和 y 像素值?事件 x 和 y 需要计算什么?

我正在使用来自this answer 的平移和缩放代码:

var zoom = function(clicks) {
    var pt = ctx.transformedPoint(lastX,lastY);
    ctx.translate(pt.x,pt.y);
    var factor = Math.pow(scaleFactor,clicks);
    ctx.scale(factor,factor);
    ctx.translate(-pt.x,-pt.y);
    redraw();
}

var handleScroll = function(evt) {
    var delta = evt.wheelDelta ? evt.wheelDelta/40 : evt.detail ? -evt.detail : 0;
    if (delta) zoom(delta);
    return evt.preventDefault() && false;
};

Example website

【问题讨论】:

  • 你能告诉我们一些你试过的代码吗?
  • @cereallarceny - 感谢您的耐心和帮助!我删除了我以前无用的帖子。所以给定上面的代码,在用户缩放后,我需要做哪些计算才能在 mousedown 事件中获取图像 x 和 y 像素?

标签: javascript canvas mouseevent transform


【解决方案1】:

如果您只是想在单击后获取鼠标 X 和 Y 的位置,那么您应该在 Javascript 中将函数附加到 mousedown 事件。这称为事件绑定。简而言之,在 DOM 中,您可以将事件绑定到页面中的元素。 Here's an example I made 显示绑定到 #box 元素的事件。

document.getElementById("box").onmousedown = function() {
    var posx = 0;
    var posy = 0;
    if (!e) var e = window.event;
    if (e.pageX || e.pageY)     {
        posx = e.pageX;
        posy = e.pageY;
    }
    else if (e.clientX || e.clientY)     {
        posx = e.clientX + document.body.scrollLeft
            + document.documentElement.scrollLeft;
        posy = e.clientY + document.body.scrollTop
            + document.documentElement.scrollTop;
    }

    alert("Mouse x: " + posx + "\nMouse y: " + posy);
};​

这段代码找到一个ID为box的元素,并告诉函数中的代码在每次按下鼠标后运行。在此示例中,我们还回退到旧系统,以确保它可以跨平台和跨浏览器工作。如果您想将此事件绑定到整个网页而不仅仅是一个元素,那么您可以将document.getElementById("box") 替换为window。

然而,这不会计算 DOM 元素内的相对位置。有多种方法可以做到这一点,我不会在这里详细介绍,但我将在下面介绍一些方法。祝你好运!

资源

【讨论】:

  • 感谢@cereallarceny 的回答。我确实知道如何附加事件,并且您的代码适用于未缩放的画布。我的问题更多是如何在用户缩放后计算图像 x 和 y 像素(缩放代码在第一个发布的代码部分中)。请注意,缩放代码会移向用户正在放大的鼠标点,因此它会沿途进行平移。我无法弄清楚在缩放后获取鼠标单击的图像 x 和 y 所需的计算......
  • 我不明白为什么会有所不同。我的意思是,如果您要单击,然后放大该点,然后再次单击,x 和 y 会不会比放大之前稍微准确一些?在这种情况下,我建议在放大之前存储 x 和 y,然后在完成缩放时使用这些值。
  • 是的,我认为它也应该是一样的,我在缩放之前存储了 x & y。从上面的缩放函数中,我存储了 pt 和 factor 变量并在下面使用它(所以来自 zoom() 的 pt 与下面的 pt 相同,等等)。这是我的简化代码,它不起作用(它很接近但正确......
  • 函数 mousedown_listener ( event ) { var x = event.pageX; var y = event.pageY;变种点 = { 'x' : 0, 'y' : 0 }; if ( 因子 == 1.0 ) { point.x = x - pt.x;点.y = y - pt.y; } else { point.x = ( pt.x - x ) / 因子 + x; point.y = ( pt.y - y ) / 因子 + y; } [...]
  • 好吧,我觉得自己像个白痴,为什么我不能正确格式化代码?我已阅读帮助,但仍有问题...叹息
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-02
  • 2016-09-16
  • 2020-06-11
  • 1970-01-01
  • 2010-12-03
  • 1970-01-01
  • 2013-12-26
相关资源
最近更新 更多