- ベストアンサー
drawImageの描画順序の指定について
- drawImageメソッドを使用し、Canvasへ画像を描画するプログラムを作成しています。画像は全部3枚あり、座標をずらしてすべて重ねて表示します。
- 現在のコーディングですと、指定した描画順序のとおりに描画されません。複数の画像に対してonloadを使用しており、画像の読み込みが完了した順番に描画されているような気がします。指定したとおりに描画できる方法はないでしょうか?
- 描画順序を選択してCanvasに描画するプログラムを作成していますが、指定した描画順序通りの表示ができません。onloadを使用して画像の読み込み完了を待ってから描画しているため、順番通りに表示されないようです。対処方法を教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
それぞれのImageのonloadのイベントハンドラーで、すぐにCanvas.drawImageするのではなく、イベントハンドラー内でいったんImageたちを別の格納用配列Imagesにしまっておきます。そして、Imagesの格納数が3以上になっていれば、drawImageの処理を行うってのはどうでしょうか。 var Image1 = new Image(); var Image2 = new Image(); var Image3 = new Image(); Image1.src = GetImageFileName(1); Image2.src = GetImageFileName(2); Image3.src = GetImageFileName(3); x = f.order.value //グローバルスコープ Image1.onload = function() { Images[1] = Image1; if(Images.length >=3 ) draw(x); } Image2.onload = function() { Images[2] = Image2; if(Images.length >=3 ) draw(x); } Image3.onload = function() { Images[3] = Image3; if(Images.length >=3 ) draw(x); } function draw(x){ switch(x){ case "0": Canvas.drawImage(Images[1], 0, 0); Canvas.drawImage(Images[2], 20, 20); Canvas.drawImage(Images[3], 40, 40); break; case "0": .............. } }
その他の回答 (1)
- reggaepunc
- ベストアンサー率59% (64/108)
一部端折ったりしてますが、少し書き足して、Main()の中のImage1,2,3の変数を外に出しました。canvasに描画されてるかどうかは別として、これで画像のプリロードはOKかなと思います。ポイントはinit()です。 <script> var Image1 = new Image(); var Image2 = new Image(); var Image3 = new Image(); // プリロード用 function init() { Image1.src = 'photo01.jpg'; Image2.src = 'photo02.jpg'; Image3.src = 'photo03.jpg'; var bodyTag = document.body; var div = document.createElement('div'); div.style.display = 'none'; div.appendChild( Image1 ); div.appendChild( Image2 ); div.appendChild( Image3 ); bodyTag.appendChild( div ); } init(); // -------------------------------- function Main( f ) { var canvas = document.getElementById('main'); if (!canvas || !canvas.getContext) { return false; } var Canvas = canvas.getContext('2d'); Canvas.clearRect(0, 0, 320, 240); if( f.order.value == 0 ) { // -------------------------------- Image1.onload = function() { Canvas.drawImage(Image1, 0, 0); } // -------------------------------- Image2.onload = function() { Canvas.drawImage(Image2, 20, 20); } // -------------------------------- Image3.onload = function() { Canvas.drawImage(Image3, 40, 40); } // -------------------------------- Image1.src = GetImageFileName(1); Image2.src = GetImageFileName(2); Image3.src = GetImageFileName(3); } else if (f.order.value == 1) { Image1.onload = function() { Canvas.drawImage(Image1, 0, 0); } Image3.onload = function() { Canvas.drawImage(Image3, 20, 20); } Image2.onload = function() { Canvas.drawImage(Image2, 40, 40); } Image1.src = GetImageFileName(1); Image3.src = GetImageFileName(3); Image2.src = GetImageFileName(2); } } // -------------------------------- // -------------------------------- function GetImageFileName( val ) { switch( val ) { case 1: return 'photo01.jpg'; break; case 2: return 'photo02.jpg'; break; case 3: return 'photo03.jpg'; break; } } </script>
お礼
ご回答ありがとうございます。 あらかじめ画像を読み込んでおくということですね。
お礼
ご回答ありがとうございます。 Image3がいちばん最初にロードされた場合、その時点で Images.lengthは3以上になってしまいます。 そのため、カウンタを設け、ロードが完了すればカウントアップ するようにしたところ、きちんと表示されました。 ブラウザは、firefox、opera、chrome、safariと、 excanvas.jsをロードしたIEにて確認を行いましたが、 いずれも問題ありませんでした。 ありがとうございました。