Реализация слоев в HTML5 Canvas - PullRequest
       5

Реализация слоев в HTML5 Canvas

23 голосов
/ 12 декабря 2010

Я собираюсь реализовать Photoshop-подобные слои в HTML5 Canvas. В настоящее время у меня есть две идеи. Первая и, возможно, более простая идея - иметь элемент Canvas для каждого слоя, например:

<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.

Вторая идея - использовать один элемент Canvas и реализовать некоторую логику для обработки слоев, как в этом случае:

<!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 мсек.

Итак, вопрос в том, какой путь будет лучшим? Каковы плюсы и минусы обоих подходов?

Ответы [ 4 ]

26 голосов
/ 13 декабря 2010

Если вы хотите использовать один элемент canvas и иметь несколько слоев внутри него, вы можете посмотреть мою библиотеку:

Itиспользует поврежденную прямоугольную систему, чтобы уменьшить объем перерисовки, выполняемой при каждом изменении холста, поэтому вы не только получаете слои (которые могут быть вложенными), но вы также получаете оптимизированные перерисовки.

Вот простая демонстрация:

21 голосов
/ 12 декабря 2010

Использование нескольких полотен должно быть быстрее, потому что холст отрисовывается за пределами экрана, а затем просто перетаскивается на экран браузером.Вы возлагаете бремя переключения слоев на браузер, который просто перемещает некоторые прямоугольники графических данных.

Если вы делаете наложение самостоятельно, у вас больше контроля, но бремя лежит на JS иДвигатель JS делает всю работу.Я бы избежал этого, если бы у меня был выбор, но если вы собираетесь использовать эффекты слоев, которые работают на нижележащих слоях, это может быть вашим единственным выбором.

2 голосов
/ 23 ноября 2012

Установка относительного значения контейнера div должна предотвратить проблему с перезаписью слоя.Попробуйте установить позицию для «скрытого текста» - например, если он в настоящий момент является абсолютным, он, очевидно, пойдет в той же области, что и верхний левый угол относительного материала.в HTML вы можете исключить использование оси Z.Если вы хотите, чтобы ваш материал был универсальным (и для других разработчиков тоже), используйте ось z, но сохраняйте базовую линию, к которой вы добавляете свои индексы слоя (чтобы базовая линия могла быть изменена при использовании другого кода с использованием оси z проблемным способом).

1 голос
/ 06 августа 2015

Используя jCanvas , см. API его слоя: http://projects.calebevans.me/jcanvas/docs/layerAPI/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...