我想在动作mousemove时绘制图像,但是当我在使用drawImage时mousemove
得到错误的图像(请参见右图):
为什么在动作时图像绘制不好mousemove
?
PS:我想用高质量的左图绘制右图;
var canvas = document.getElementById('canvas_test');
var context = canvas.getContext("2d");
var img_test__src = 'http://image.prntscr.com/image/8233c5a42e7e4b40a19c64d8e9b892ee.png';
var img = new Image();
img.src = img_test__src;
img.onload = function() {
context.save();
context.beginPath();
context.drawImage(img, 100, 100, 71, 71);
context.closePath();
context.restore();
};
canvas.addEventListener('mousemove', function(evt) {
var img = new Image();
img.src = img_test__src;
img.onload = function() {
context.save();
context.beginPath();
context.drawImage(img, 200, 100, 71, 71);
context.closePath();
context.restore();
};
});
#canvas_test {
background: #000;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<canvas id="canvas_test" width="500" height="500"></canvas>
绝对不要在事件中渲染。频率和时序不受您的控制,并且可能产生各种问题,尤其是当您开始发生许多此类事情时。
requestAnimationFrame
即使仅用于一帧也要使用。这将确保正确绘制图像并与正在发生的任何其他动画或视觉更新同步。
不要一遍又一遍地加载图像!!!
我必须给出答案,因为您也在事件中加载图像。
每移动一次鼠标,也许每秒移动约100或更多,您就会创建一个新图像并等待其加载。您应该已经注意到页面有时会滞后。
一次加载图像。
例子
我假设您想要将鼠标悬停在FX上
var canvas = document.getElementById('canvas_test');
var context = canvas.getContext("2d");
var img_test__src = 'http://image.prntscr.com/image/8233c5a42e7e4b40a19c64d8e9b892ee.png';
var img = new Image();
img.src = img_test__src;
img.onload = drawImg;
var mouseOver = false;
function drawImg(){
if(img.complete){ // has image loaded
context.clearRect(0,0,canvas.width,canvas.height);
context.globalAlpha = mouseOver ? 1 : 0.5;
context.drawImage(img,0,0);
context.globalAlpha = 1;
}
}
canvas.addEventListener('mouseover', function(evt) {
mouseOver = true;
requestAnimationFrame(drawImg);
});
canvas.addEventListener('mouseout', function(evt) {
mouseOver = false;
requestAnimationFrame(drawImg);
});
#canvas_test {
background: #000;
}
<canvas id="canvas_test" width="65" height="65"></canvas>
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句