在画布上用鼠标绘制矩形与鼠标坐标不同步

Posted

技术标签:

【中文标题】在画布上用鼠标绘制矩形与鼠标坐标不同步【英文标题】:Drawing rectangle with mouse on canvas is not insync with mouse coordinates 【发布时间】:2021-08-18 13:19:50 【问题描述】:

我试图在画布上拖动鼠标时绘制矩形。 canavs 覆盖在 html5 视频 js 播放器上。矩形正在绘制,但它没有从正确的坐标开始向下。

我的画布(覆盖在视频上)正在渲染,周围有一些像空间一样的边距(不是我检查的边距)。我认为这是矩形不与鼠标光标同步的原因(有点偏离)。这是我的代码

 onMouseDown = (e) => 
        this.setState(
            
        )
        let start_x = e.clientX
        let start_y = e.clientY

        this.setState(
            is_drawing: true
            draw_start_x: start_x,
            draw_start_y: start_y
        ,)
    

onMouseMove = (e) => 
        let myCanvas1 = document.getElementById('myCanvas')
        let ctx1 = myCanvas.getContext('2d')
     
        if(this.state.is_drawing)

            ctx1.clearRect(0, 0, myCanvas.width, myCanvas.height);
            ctx1.beginPath()
            let width = e.clientX - this.state.draw_start_x
            let height = e.clientY - this.state.draw_start_y
           
            ctx1.fillStyle = '#000'
            ctx.fillRect(this.state.draw_start_x, this.state.draw_start_y, width, height)
            ctx1.stroke()
        
    

render()
        return (
            <div>
                <div className='video-container data-vjs-player'>
                    <canvas
                        id="myCanvas"
                        className='myCanvas'
                        onMouseDown=this.onMouseDown
                        onMouseMove=this.onMouseMove
                        onMouseUp=this.onMouseUp
                        onClick=this.onClick
                    />
                    <video
                        ref= node => this.videoNode = node 
                        // onContextMenu="return false;"
                        //ref=this.video_element
                        className="video video-js video-el vjs-big-play-centered vjs-default-skin"
                        id="video-el" loop=false controls>
                        <source
                            src="https://www.rmp-streaming.com/media/big-buck-bunny-360p.mp4" type="video/mp4"/>
                    </video>
                    <button className="play-btn" onClick=this.playPause>Play</button>
                </div>
            </div>

        )
    


scss 文件

.video-container

 background-color: aliceblue;
  width: 50%;
  height: calc(100% - 250px);
  position: relative;
  margin: 0;

  .myCanvas
    position: absolute;
    top: 0;
    left: 0;
    z-index: 10;
    background-color:rgba(255,0,0,0.5);
  
  .video 
    width: 100%;
    height: auto;
    position: absolute;
    top: 0;
    left: 0;
  
  .play-btn
    position: relative;
  

应用截图

如果你能看到,红色画布周围有类似空白的空白。我想这就是我的鼠标和矩形的偏移量。

【问题讨论】:

【参考方案1】:

我做了这个codesandbox 这就是你想要实现的,我不得不稍微调整代码以使其工作,我认为主要原因是某些元素的默认边距或填充。通过设置

*
   margin:0;
   padding: 0
 

scss 文件的顶部,它开始正确绘制。

【讨论】:

以上是关于在画布上用鼠标绘制矩形与鼠标坐标不同步的主要内容,如果未能解决你的问题,请参考以下文章

在画布上用鼠标画线:Java awt

在鼠标位置绘制矩形和形状渲染矩形

使用canvas画布利用js通过鼠标实现矩形的绘制(任意方向的绘制图形)

如何使用画布和javascript同时绘制线条在鼠标指针顶部显示x和y坐标

Tkinter:获取鼠标绘制矩形的坐标

使用鼠标在 python tkinter 画布上绘制并获取指向列表的点?