2010-12-12 29 views
23

HTML5キャンバスにPhotoshopのようなレイヤーを実装しようとしています。現在私は2つのアイデアがあります。最初に、多分シンプルな考え方は次のようにそれぞれの層のためのcanvas要素を持つことです。HTML5キャンバスにレイヤーを実装する

<canvas id="layerName" width="320" height="240" style="position: absolute; left: 0; top: 0; z-index: 1;"></canvas> 
<canvas id="layerName" width="320" height="240" style="position: absolute; left: 0; top: 0; z-index: 2;"></canvas> 
<canvas id="layerName" width="320" height="240" style="position: absolute; left: 0; top: 0; z-index: 3;"></canvas> 

レイヤーに描くこの方法 - それは実際には「層」になります。透明な位置のレイヤーは、レイヤー(キャンバス)の下まで見ることができます。レイヤスタッキングはz-indexプロパティで制御されます。

第アイデアは単一キャンバス要素を使用し、この場合のように層を処理するために、いくつかのロジックを実装することである:上記のコードで

<!DOCTYPE html> 
<html> 
    <head> 
     <title>Test</title> 
     <script> 
      window.addEventListener('load', function() { 
       var canvas = document.getElementById("canvas"); 
       var ctx = canvas.getContext("2d"); 

       var order = 0; 

       function drawLayer1() { 
        ctx.fillStyle = "rgb(200,0,0)"; 
        ctx.fillRect (10, 10, 55, 50); 
       } 

       function drawLayer2() { 
        ctx.fillStyle = "rgba(0, 0, 200, 0.5)"; 
        ctx.fillRect (30, 30, 55, 50); 
       } 

       function draw() { 
        ctx.clearRect(0, 0, 256, 256); 

        if (order === 0) { 
         drawLayer1(); 
         drawLayer2(); 
        } 
        else { 
         drawLayer2(); 
         drawLayer1(); 
        } 
       } 

       setInterval(draw, 250); 
       setInterval(function() { 
        order = 1 - order; 
       }, 200); 
      }, false); 
     </script> 
    </head> 
    <body> 
     <canvas id="canvas" width="256px" height="256px"></canvas> 
    </body> 
</html> 

二層を順番毎200ミリ秒を積層変わります。

だから、どのような方法が最良の方法でしょうか?両方のアプローチの長所と短所は何ですか?

答えて

26

あなたは、単一のcanvas要素を使用すると、その中に複数の層を持っている場合は、あなたが私の図書館で見たいと思うかもしれません:

それは減らすために破損しRECTシステムを使用していますキャンバスが変更されるたびに行われる再ペイントの量です。レイヤー(入れ子にすることができます)を取得するだけでなく、最適化された再描画も取得します。

はここで簡単なデモです:

+1

すごくいいですね!あなたの仕事を共有してくれてありがとう。 :) –

+1

リンクが壊れています... – Tek

+2

@Tek:ありがとう!リンクが修正されました。 – Ant

20

複数のキャンバスを使用する方が高速です。なぜなら、キャンバスは画面外に描画され、ブラウザによって画面にブリッジされるからです。ブラウザーにレイヤーを切り替えるという負担をかけるだけで、グラフィックデータのいくつかの矩形を動かすだけです。

レイヤリングを自分で行うと、コントロールが増えますが、JSエンジンとJSエンジンですべての作業を行う負担があります。私は選択肢があればこれを避けるだろうが、基礎となるレイヤーで動作するレイヤーエフェクトを作成する場合は、これが唯一の選択肢かもしれない。

+0

あなたはしかし、 'とはどういう意味ですか? – Tower

+0

彼はphotoshopのlayerModesのようなものを意味します:スクリーン、違い、ライト、ダークンなど... – Zevan

+0

はい、@ゼバンは言う。 – moeffju

2

コンテナのdiv相対的な設定は、その層-上書き問題を妨げてきたはずです。 「閉塞したテキスト」の位置を設定してみてください。それが現在絶対的なものであれば、相対的なものの左上と同じ領域に入ることは明らかです。

おそらく明らかですが、htmlのdivの順番で、z軸の使用を排除できます。あなたのものを一般的にしたい場合(そして他の開発者にとっても)、z軸を使用しますが、レイヤインデックスを追加するベースラインを保存します(問題のある方法でz軸を使って他のコードを使用する場合、 )。 jCanvasを使用して

関連する問題