gpt4 book ai didi

javascript - HTML5 Canvas 变形

转载 作者:行者123 更新时间:2023-12-02 14:54:29 26 4
gpt4 key购买 nike

我试图在动态大小的视频上包含一个 Canvas 元素,该视频将异步加载。在 Canvas 上,用户将能够拖动矩形选择框并调整其大小。

在我的 JS 文件中,我有一个监听器监 window 口,并通过 canvas 元素的 .width 和 .height 属性将 Canvas 大小调整为视频的确切宽度和高度。

对于 JS 矩形选择代码,我正在遵循此 StackOverflow 问题的第一个答案中的 fiddle :drawing a rectangle with mouse click and drag - javascript但是,由于某种原因,当用户在页面上向下滚动时, Canvas 上的绘图完全扭曲,并且矩形开始绘制在距离鼠标很远的地方。然而,当用户位于页面顶部时,矩形将绘制在正确的位置。为什么会出现这种情况?

下面是我正在使用的一些 JS 代码:

  
// Happens on mousedown event
downCanvas: function(e) {
$('.label-grid-canvas').css('cursor','crosshair');
this.isDrawing = true
this.startX = parseInt(e.clientX - this.offsetX);
this.startY = parseInt(e.clientY - this.offsetY);
},

// Happens on mouseup event
upCanvas: function(e) {
this.isDrawing = false;
$('.label-grid-canvas').css('cursor','default');
},
// Happens on mousemove event
moveCanvas: function(e) {
if (this.isDrawing) {
var mouseX = parseInt(e.clientX - this.offsetX);
var mouseY = parseInt(e.clientY - this.offsetY);

this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);
this.ctx.beginPath();
this.ctx.rect(this.startX, this.startY, mouseX - this.startX, mouseY - this.startY);
this.ctx.stroke();
}
},

resizeCanvas: function() {
this.canvas.width = $('#video-canvas')[0].offsetWidth;
this.canvas.height = $('#video-canvas')[0].offsetHeight;

this.canvasOffset = $('.label-grid-canvas').offset();
this.offsetX = this.canvasOffset.left;
this.offsetY = this.canvasOffset.top;

this.redraw();
},

redraw: function() {
this.ctx.strokeStyle = 'blue';
this.ctx.lineWidth = '2';
this.ctx.strokeRect(0, 0, $('#video-canvas')[0].offsetWidth,
$('#video-canvas')[0].offsetHeight);
},

// Happens after page-load
initialize: function(options) {
this.canvas = document.getElementById('label-grid-canvas');
this.isDrawing = false;
this.ctx = this.canvas.getContext('2d');
this.startX;
this.startY;
this.canvasOffset = $('.label-grid-canvas').offset();
this.offsetX = this.canvasOffset.left;
this.offsetY = this.canvasOffset.top;
$(window).on('resize', _.bind(this.resizeCanvas, this));
....
}

请忽略效率低下的问题,我只是先尝试​​将一个正在工作的东西组合在一起,然后再清理它。

最佳答案

以下框架显示了在计算鼠标位置时如何考虑调整大小和滚动。

var canvas=document.getElementById("canvas");
var ctx=canvas.getContext("2d");
var cw=canvas.width;
var ch=canvas.height;
function reOffset(){
var BB=canvas.getBoundingClientRect();
offsetX=BB.left;
offsetY=BB.top;
}
var offsetX,offsetY;
reOffset();
window.onscroll=function(e){ reOffset(); }
window.onresize=function(e){ reOffset(); }

var isDown=false;
var startX,startY,mouseX,mouseY;

var $mouse=$('#mouse');
$("#canvas").mousemove(function(e){handleMouseMove(e);});

function handleMouseMove(e){
// tell the browser we're handling this event
e.preventDefault();
e.stopPropagation();
// calc the current mouse position
mouseX=parseInt(e.clientX-offsetX);
mouseY=parseInt(e.clientY-offsetY);
// report the mouse position
$mouse.text('Mouse position: '+mouseX+' / '+mouseY);
}
body{ background-color: ivory; }
#canvas{border:1px solid red; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<h4 id=mouse>Move the mouse around the canvas.</h4>
<canvas id="canvas" width=300 height=300></canvas>

关于javascript - HTML5 Canvas 变形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35926362/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com