2010-12-12 49 views
23

我即將在HTML5畫布中實現類似Photoshop的圖層。目前我有兩個想法。第一個,也許是簡單的想法是有像每層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> 

這樣 - 它實際上將轉到「層」。可以看到透明位置的圖層到圖層下面(Canvases)。層堆疊由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元素和其內部都有多個圖層,你可能想看看我的圖書館:

它使用損壞的矩形系統,以減少每次畫布更改時都會進行重新繪製的數量,因此您不僅可以獲取圖層(可以嵌套),還可以優化重繪。

這裏有一個簡單的演示:

+1

看起來很棒!感謝您分享您的工作。 :) – 2010-12-13 10:21:44

+1

鏈接被破壞... – Tek 2013-08-15 13:11:47

+2

@Tek:謝謝!鏈接固定。 – Ant 2013-08-15 17:28:25

20

使用多個畫布應該更快,因爲畫布被拖出屏幕,然後通過瀏覽器傳遞到屏幕。您將切換層的負擔放在瀏覽器上,這隻需要移動一些矩形的圖形數據。

如果你自己做分層,你有更多的控制權,但是JS和JS引擎負擔的工作量很大。如果我有選擇,我會避免這種情況,但是如果您要使用適用於底層圖層的圖層效果,這可能是您唯一的選擇。

+0

你是什麼意思',但如果你要爲圖層效果是在底層layers'工作? – Tower 2010-12-12 17:32:28

+0

他意味着像photoshop中的layerModes:Screen,DIFFERENCE,LIGHTEN,DARKEN等... – Zevan 2010-12-12 17:38:59

+0

是的,@Zevan說的是什麼。 – moeffju 2010-12-12 18:06:11

2

div容器相對的設置應當阻止該層覆蓋問題。嘗試在「遮擋文字」上設置位置 - 例如如果它現在是絕對的,它將顯然與相關東西的左上角位於相同的區域。

它可能是顯而易見的,但通過html中的div順序,您可以消除使用z軸。如果您希望自己的東西是通用的(也適用於其他開發人員),請使用z軸,但存儲添加圖層索引的基線(以便在以有問題的方式使用其他代碼時使用z軸進行基準調整)。