javascript - 如何使用单个函数在画布上绘制多个图像?
问题描述
我正在尝试将多个图像绘制到 HTML Canvas 元素上。
assetData
是一个对象数组,每个对象都包含从数据库中获取的将图像写入画布所需的数据。至关重要的是,assetData
它可以是任意长度:它可以包含一个图像,也可以包含 100 个。
下面的代码不起作用,因为gfxCtx.drawImage()
多次绘制数组中指定的最终图像,而不是每个单独的图像。
for(var x = 0; x < assetData.length; x++) {
var layer = eval(assetData[x])
var gfx = new Image
gfx.src = "images/" + layer.src
gfx.onload = function() {
gfxCtx.drawImage(gfx, layer.x, layer.y, layer.w, layer.h)
compile()
}
}
compile()
处理将图像绘制到画布上
如果要绘制固定数量的图像,我会将每个图像分配给一个单独的变量。然而,在这种情况下,我不一定知道要绘制多少张图像,并且我想保持代码相当简洁。
这个问题有干净、直接的解决方案吗?
谢谢!
解决方案
要解决此问题,请考虑forEach()
在阵列上使用该方法,而不是像当前那样assetData
使用常规循环。for
这必须为每个循环迭代创建一个独特的“闭包”,这反过来又允许您根据需要将每个独特的图像正确地绘制到画布中:
assetData.forEach(function(assetItem) {
// This function has a unique closure which
// allows you to draw the current assetItem
// to the canvas to achieve the desired result
var layer = eval(assetItem);
var gfx = new Image();
gfx.src = "images/" + layer.src;
gfx.onload = function() {
gfxCtx.drawImage(gfx, layer.x, layer.y, layer.w, layer.h);
compile();
}
});
推荐阅读
- java - Java 应用程序间歇性崩溃 - 为什么
- angular - Angular Effect 没有被调用
- swift - 在 Swift 调试器中,我如何查看捕获到异常的位置?
- javascript - CSS和js模板,在同一个窗口中打开窗口
- ios - NativeScript 只能在 Xcode 6.0 或更高版本中运行
- java - Java System.in、换行符和解析命令行
- excel - VBA宏每X行更改单元格内容
- matlab - 计算多个 FFT 的平均值
- vue.js - Vue - 子选择触发父方法
- python - SKLearn/Tabluar Data:如何处理包含除一种热编码以外的列表的 DataFrame 元素?