2012-10-12 26 views
1

我想在画布上绘制多个图像(背景,在背景上的另一个图像, 和该图像上又一个图像会来), 但有时它加载图像和有时不是, 我用setTimeout延迟drawImage和加载,但仍然无法正常工作。canvas.drawImage不绘制所有图像

if(somecondition) 
{ 
    //background image is 70kb 
    //image on background is 65kb 

    img3.src = "Image path"; //images is almost 2kb 
    img4.src = "Image path"; //images is almost 2kb 
    img5.src = "Image path"; //images is almost 2kb 
    img6.src = "Image path"; //images is almost 2kb 
    setTimeout(function() 
    { 
     img3.onload = function() 
     { 
      context.drawImage(img3, 272, 139, 172, 31); 
     } 
    },1000); 
    console.log("Linesss2 > 4 "+lines2); 
    bottomY = 290+((lines1-5)*10); 
    middleHeight = bottomY - 170; 




    setTimeout(function() 
    { 
     img4.onload = function() 
     { 
      context.drawImage(img4, 272, 170, 172, middleHeight); ///272 
     } 
     img6.onload = function() 
     { 
      context.drawImage(img6, 272, bottomY, 172, 71); 
     } 
    },1000); 

    } 
    var metrics1 = context.measureText(canvasText1); 
    var testWidth1 = metrics1.width; 

    var metrics2 = context.measureText(canvasText2); 
    var testWidth2 = metrics2.width; 

    context.fillText(canvasText1, 169.5-(testWidth/2), y-20); 
    context.fillText(canvasText2, 169.5-(testWidth/2), y-20); 
    wrapTextForCanvas1(context, canvasText1, 50, 180); 
    wrapTextForCanvas2(context, canvasText2, 260, 180); 
} 
+0

建议:如果你希望人们调试代码,创建的jsfiddle(www.jsfiddle.net),并张贴链接在这里。 –

+0

它们没有被绘制,因为'onload'可能在你的'setTimeout'被调用之前被触发。 – Shmiddty

回答

2

因此,您不想运行任意超时,您希望在每个图像加载时收到通知。这样你就可以确定它们在你开始尝试使用它们之前已经全部加载了。只需设置每个图像的onload回调,以增加一个计数器。当该计数器达到您必须加载的图像数量时,它们全部完成,您可以开始使用它们。

我最近回答了另一个问题。在这里看到修改后的代码: http://jsfiddle.net/enhzflep/RLP5Y/

还是这里的问题本身:Images from previous functions are not drawn in the background (Canvas)

+1

感谢“enhzflep”,我会试试这个。 – SML