2010-12-12 47 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轴进行基准调整)。