当前位置: 首页 > 面试题库 >

画布中鼠标的实际位置

方河
2023-03-14
问题内容

我正在尝试用鼠标在HTML5画布上绘制,但是似乎正常工作的唯一方法是,如果出于某种原因,如果我更改了画布位置,那么画布是否位于0,0(左上角)的位置它的绘制效果不理想。这是我的代码。

 function createImageOnCanvas(imageId){
    document.getElementById("imgCanvas").style.display = "block";
    document.getElementById("images").style.overflowY= "hidden";
    var canvas = document.getElementById("imgCanvas");
    var context = canvas.getContext("2d");
    var img = new Image(300,300);
    img.src = document.getElementById(imageId).src;
    context.drawImage(img, (0),(0));
}

function draw(e){
    var canvas = document.getElementById("imgCanvas");
    var context = canvas.getContext("2d");
    posx = e.clientX;
    posy = e.clientY;
    context.fillStyle = "#000000";
    context.fillRect (posx, posy, 4, 4);
}

HTML部分

 <body>
 <div id="images">
 </div>
 <canvas onmousemove="draw(event)" style="margin:0;padding:0;" id="imgCanvas"
          class="canvasView" width="250" height="250"></canvas>

我已经读过一种方法可以在JavaScript中创建一个简单的函数来获得正确的位置,但是我不知道该怎么做。


问题答案:

简单的1:1方案

对于canvas元素与位图大小相比为1:1的情况,可以使用以下代码段获取鼠标位置:

function getMousePos(canvas, evt) {
    var rect = canvas.getBoundingClientRect();
    return {
      x: evt.clientX - rect.left,
      y: evt.clientY - rect.top
    };
}

只需从事件中调用它,并以事件和画布作为参数即可。它返回一个带有x和y的鼠标位置的对象。

由于您获得的鼠标位置是相对于客户端窗口的,因此您必须减去canvas元素的位置才能将其相对于元素本身进行转换。

代码集成示例:

//put this outside the event loop..
var canvas = document.getElementById("imgCanvas");
var context = canvas.getContext("2d");

function draw(evt) {
    var pos = getMousePos(canvas, evt);

    context.fillStyle = "#000000";
    context.fillRect (pos.x, pos.y, 4, 4);
}

注意:如果将边框和填充直接应用于canvas元素,则会影响位置,因此需要通过getComputedStyle()-或将这些样式应用于父div来考虑。

当元素和位图的大小不同时

例如,当元素的大小与位图本身不同时,可以使用CSS缩放元素,或者存在像素长宽比等。您必须解决这个问题。

例:

function  getMousePos(canvas, evt) {
  var rect = canvas.getBoundingClientRect(), // abs. size of element
      scaleX = canvas.width / rect.width,    // relationship bitmap vs. element for X
      scaleY = canvas.height / rect.height;  // relationship bitmap vs. element for Y

  return {
    x: (evt.clientX - rect.left) * scaleX,   // scale mouse coordinates after they have
    y: (evt.clientY - rect.top) * scaleY     // been adjusted to be relative to element
  }
}

将转换应用于上下文(缩放,旋转等)

然后是更为复杂的情况,其中您已对上下文应用了变换,例如旋转,倾斜/剪切,缩放,平移等。要对此进行处理,您可以计算当前矩阵的逆矩阵。

较新的浏览器使您可以通过currentTransform属性读取当前矩阵,而Firefox(当前alpha)甚至可以通过来提供反向矩阵mozCurrentTransformInverted。但是,Firefox
mozCurrentTransform将通过而不是返回Array
DOMMatrix。通过实验性标记启用的Chrome都不会返回,DOMMatrix而是返回SVGMatrix

但是,在大多数情况下,您将必须实施自己的自定义矩阵解决方案(例如,这里是我自己的解决方案-free / MIT项目),直到获得全面支持。

当最终获得矩阵时,无论获取矩阵的路径如何,都需要将其反转并将其应用于鼠标坐标。然后将坐标传递到画布,画布将使用其矩阵将其转换回当前位置。

这样,该点将相对于鼠标处于正确的位置。同样在这里,您需要调整坐标(在对它们应用逆矩阵之前),使其相对于元素。

一个仅显示矩阵步骤的示例

function draw(evt) {
    var pos = getMousePos(canvas, evt);        // get adjusted coordinates as above
    var imatrix = matrix.inverse();            // get inverted matrix somehow
    pos = imatrix.applyToPoint(pos.x, pos.y);  // apply to adjusted coordinate

    context.fillStyle = "#000000";
    context.fillRect(pos.x-1, pos.y-1, 2, 2);
}

currentTransform在实现时使用的示例如下:

    var pos = getMousePos(canvas, e);          // get adjusted coordinates as above
    var matrix = ctx.currentTransform;         // W3C (future)
    var imatrix = matrix.invertSelf();         // invert

    // apply to point:
    var x = pos.x * imatrix.a + pos.y * imatrix.c + imatrix.e;
    var y = pos.x * imatrix.b + pos.y * imatrix.d + imatrix.f;


 类似资料:
  • 问题内容: 有没有一种方法可以将位置鼠标插入标签?我想要相对于而不是整个页面右上角的位置。 问题答案: 最简单的方法可能是向canvas元素添加onmousemove事件侦听器,然后您可以从事件本身获取相对于画布的坐标。 如果您只需要支持特定的浏览器,则完成此任务很简单,但是f.ex之间存在差异。Opera和Firefox。 像这样的东西应该适用于这两个:

  • 本文向大家介绍html5-canvas 检测鼠标在画布上的位置,包括了html5-canvas 检测鼠标在画布上的位置的使用技巧和注意事项,需要的朋友参考一下 示例 本示例将说明如何获取鼠标相对于画布的位置,例如(0,0)HTML5 Canvas的左上角。的e.clientX和e.clientY将获得相对于文档的顶部位置的鼠标,来改变这种是基于画布的顶部,我们减去left,并right从客户端X和

  • 我们体验一下Events类吧!为了使其尽量简单,我们使用Events类的getMousePos()获取鼠标光标的坐标,并在画布的左上角显示出来。getMousePos()方法返回相对于画布的坐标,它会考虑画布相对于页面的偏移,以及页面的滚动位置。 图6-1 画布坐标系 操作步骤 按照以下步骤,在每次鼠标移动时,获取画布上的鼠标坐标,并在画布的左上角显示出来: 1. 链接到Events类: <sc

  • 问题内容: 尝试使用awt canvas上的鼠标来绘制图形(目前为线)。Iam首次尝试Java图形。所以不确定如何去做。这是我的第一次尝试: 问题:1)将窗口最小化并还原后,绘制的线条消失了(由于要重新绘制)2)我要的是该线条应跟随鼠标移动(拖动时)。最后一行应该从按下位置到释放鼠标的位置。现在请礼节,当鼠标移动时,将绘制新的线条。我不确定如何清除画布上的中间线。 有人可以帮我解决这些问题吗? 问

  • 现在我有一个应用程序,可以让用户单击按钮浏览用作画布背景的图片。我想这样做,如果用户单击画布上的某个地方,则在该点放置一个节点。我假设我需要获取鼠标坐标。有没有一个简单的方法可以调用将节点放置在鼠标单击位置,或者我必须在这个链接中选择路线:WPF-使用鼠标事件在画布上绘图?提前谢谢。 编辑:添加了我尝试制作椭圆的代码。不过它不起作用,而且我不确定如何使用鼠标点击椭圆的坐标。我知道对于一行来说,它只

  • 我在画布上处理鼠标事件时遇到问题。我想用鼠标来绘制它,我已经想出了这些事件处理程序,但当我开始绘制时,它们什么都不做。 你能帮我告诉我遗漏了什么或者如何重写它以便它开始工作吗?