画布中的鼠标位置错位,向下向右偏移

项目场景:

画布:画布中的鼠标位置错位,向下向右偏移


问题描述:

提示:没有计算偏移量,导致画出的线位置偏移。
在这里插入图片描述
原来的代码:

 measureMouseMove(){
      let x = this.mouseLocation.eventXm1; // 获取起始位置的x轴坐标
      let y = this.mouseLocation.eventYm1; // 获取起始位置的y轴坐标
      let stopX = event.x; // 获取结束位置的x轴坐标
      let stopY = event.y; // 获取结束位置的y轴坐标
      let canvas3 = this.canvas3;
      let ctx3 = canvas3.getContext("2d");
      ctx3.clearRect (0, 0, canvas3.width, canvas3.height);// 清空画布
      ctx3.beginPath(); // 起始一条路径,或重置当前路径
      ctx3.lineWidth="2"; // 设置或返回当前的线条宽度
      ctx3.strokeStyle = "red"; // 设置或返回用于笔触的颜色、渐变或模式
      ctx3.moveTo(x, y);// 把路径移动到画布中的指定点,不创建线条
      ctx3.lineTo(stopX, stopY); // 添加一个新点,然后在画布中创建从该点到最后指定点的线条
      ctx3.closePath(); // 创建从当前点回到起始点的路径
      ctx3.stroke();// 绘制一条路径
}

原因分析:

在这里插入图片描述

注意:特别要注意上面画布中图片的坐标原点a,以及整个页面中的原点b,这两个地方有所区分。由于原点a相对于原点b的X轴和Y轴的偏移量,在画布中画出的线是相对于原点b的线,所以会把偏移量一同带过去,会造成鼠标划出的线偏移。

解决方案:

提示:把原点a相对于原点b的偏移量计算出来,在鼠标的起始位置和结束位置中都减去这个偏移量就可以了。

let offsetLeft = canvas3.getBoundingClientRect().left;// 计算左边偏移量
let offsetTop = canvas3.getBoundingClientRect().top;// 计算顶部偏移量
ctx3.moveTo(x - offsetLeft, y - offsetTop);// 把路径移动到画布中的指定点,不创建线条
ctx3.lineTo(stopX - offsetLeft, stopY - offsetTop);// 添加一个新点,创建线条

效果:鼠标轨迹和画线一致!
在这里插入图片描述

具体代码如下:

 measureMouseMove(){
      let x = this.mouseLocation.eventXm1; // 获取起始位置的x轴坐标
      let y = this.mouseLocation.eventYm1; // 获取起始位置的y轴坐标
      let stopX = event.x; // 获取结束位置的x轴坐标
      let stopY = event.y; // 获取结束位置的y轴坐标
      let canvas3 = this.canvas3;
      let offsetLeft = canvas3.getBoundingClientRect().left;// 计算左边偏移量
      let offsetTop = canvas3.getBoundingClientRect().top;// 计算顶部偏移量
      let ctx3 = canvas3.getContext("2d");
      ctx3.clearRect (0, 0, canvas3.width, canvas3.height);// 清空画布
      ctx3.beginPath(); // 起始一条路径,或重置当前路径
      ctx3.lineWidth="2"; // 设置或返回当前的线条宽度
      ctx3.strokeStyle = "red"; // 设置或返回用于笔触的颜色、渐变或模式
	  ctx3.moveTo(x - offsetLeft, y - offsetTop);// 把路径移动到画布中的指定点,不创建线条
      ctx3.lineTo(stopX - offsetLeft, stopY - offsetTop); // 添加一个新点,然后在画布中创建从该点到最后指定点的线条
      ctx3.closePath(); // 创建从当前点回到起始点的路径
      ctx3.stroke();// 绘制一条路径
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值