1. ホーム
  2. Web制作
  3. html5

キャンバスでの複数描画の順番の説明

2022-01-31 01:21:32

開発において、canvasを使って複数の絵を同時に描く必要がある場合、絵のサイズが異なるため、配列の前にある絵を先に読み込んでから描くと、描いた絵の順番が期待通りにならないことがあります(特にクロスドメイン・リダイレクトの絵のため)、私の解決策は:最初に全部描いてから並べ替えて 私の解決策は、全部描いてから、目的のノードに追記する前に並び替えることです。

<div id="myContent"></div>
let imgArray = ['img1.png', 'img2.png'];
let receiveArray = new Array();
let $myContent = document.getELmentById("myContent");
let {imgW, imgH} = {300, 300};

let Canvas = document.createElement('canvas');
let ctx = Canvas.getContext("2d");
let scaleBy = 2;
Canvas.width = imgW * scaleBy;
Canvas.height = imgH * scaleBy;
imgArray.forEach((e, idx) => {
    let img = new Image();
    img.src = e;
    e.addEventListener('load', () => {
        ctx.drawImage(img, 0, 0, imgW * scaleBy, imgH * scaleBy);
        
        let imgCont = new Image();
        imgCont.src = Canvas.toDataURL();
        imgCont.id = 'img' + idx; 
        receiveArray.push(imgCont); // collect the drawn img nodes into the array, the order here may be different from the order of imgArray
        if (receiveArray.length === imgArray.length) { // all images loaded and drawn
            let sortArr = new Array();
            receiveArray.forEach(ex => { // sort all drawn images by imgArray order
                sortArr[ex.id.split('img')[1]] = ex;
            })
            sortArr.forEach(ex2 => {
                $myContent.appendChild(ex2)
            })
        }
    })
})

実際には、これは少し無力なアプローチは、それがロードされた画像の実際のサイズを決定することは不可能であるため、小さな画像がロードされ、最初に描画される、リダイレクトされたドメインは、この現象を増加させる場合は、図面とその後のソートの練習の使用です。誰もがより良い方法を考えている場合は、批判を歓迎します。

以上が今回の記事の全てです、勉強になれば幸いです、そしてスクリプトハウスを応援していただければ幸いです。