我正在使用 HTML5 画布绘制组织结构。每个节点包括一个图像,其 URL 是从数据库中获得的。我有一个处理图像加载的小函数,一旦加载,它就会将其添加到画布中。它看起来像这样(请注意,重要的是添加到图像的 onload 侦听器):
(function (i, ctx, DrawId) {
var img = new Image();
img.src = REPORT.Structures[i].Managers[j].Employee.PhotoUrl; //get URL from object constructed elsewhere
img.onload = function () { //attach onload event
ctx.drawImage(img, x, y, width, height);//draw image on the canvas. x, y width and height are calculated inside the onload, but I have removed the calculations to improve readability
}
}
})(i, ctx, REPORT.DrawId);
这很好用,只是图像在完成加载时都会随机出现。它看起来很不整洁。
我正在寻找一种方法来使它看起来更平滑。我的第一直觉是尝试创建淡入淡出效果,但如果不一遍又一遍地重绘画布,我想不出如何做到这一点。
我曾想过尝试这样的事情:
img.onload = function () {
var counter = 1;
var width = 30 * REPORT.ZoomLevel;
var height = 30 * REPORT.ZoomLevel;
function fadeInImage(ctx, img, x, y, width, height) {
ctx.globalAlpha = 0.1 * counter;
ctx.drawImage(img, x, y, width, height);
counter++;
if (counter == 10)
clearTimeout(fadeInImageTimeout);
console.log(counter);
}
var fadeInImageTimeout = setInterval(function () { fadeInImage(ctx, img, x, y, width, height); }, 100);
}
这行得通,但我也担心如果这样做,它的处理量会太大。
有没有人试过做这样的事情?任何建议将不胜感激。
PS:我目前正在考虑只使用一个间隔来绘制所有图像。每个图像将被推入一个数组,一旦加载所有图像,就会绘制数组中的所有元素。会及时更新。
PPS:正如我在上面的 PS 中提到的那样,我已经设法让它工作。不过好像不影响性能。我想我仍然遇到的延迟与图像加载时间有关。我会尝试将代码剥离成一个简单的版本并稍后在此处发布,但如果有人能看到我的方法中的缺陷,请毫不犹豫地指出它。再次,任何建议将不胜感激。