Динамическое изменение размера сложного холста HTML5 - PullRequest
3 голосов
/ 14 февраля 2012

Я создал чертеж грузовика, используя пути на холсте HTML5. Изображение самого холста близко к 900 строкам кода, и я реализовал функцию рисования изображения на основе соотношения размеров, определяемого шириной / высотой окна. Конечным результатом является то, что холст и все элементы внутри холста динамически изменяются в соответствии с содержимым окна.

Имейте в виду, что я только на 2-й день использую холст, поэтому я, возможно, что-то упустил, но должен быть более простой способ выполнить то, что я делаю. Итак, мой вопрос: Есть ли более простой способ / метод для изменения размера холста и его внутренних элементов, когда используются сложные пути?

Пример моего кода приведен ниже и изменяет размер только под нагрузку тела. Я еще не подключил его к прослушивателю onresize ... Я не смог вместить все это, поэтому вы можете получить полный исходный код здесь:

http://www.epixseo.com/fullsource.txt

как вы можете видеть, я передаю canvasWidth в функцию semitruckv1 и определяю коэффициент изменения размера .... затем умножаю каждую координату и lineWidth на этот коэффициент изменения размера ... который занимает некоторое время ... ( быть в состоянии скопировать + вставить полный исходный код и запустить локально в вашей IDE)

<!DOCTYPE html>
<html lang="en">
 <head>
  <meta charset="UTF-8" />
  <title>Semi truck</title>
  <style type="text/css">
  body {
      margin:0px;
  }
  </style>
  <script>

    function init() {

        var viewportWidth = window.innerWidth;
        var viewportHeight = window.innerHeight;

        var canvas = document.getElementById("canvas");

        var canvasWidth = viewportWidth;
        var canvasHeight = viewportHeight;
        canvas.style.position = "fixed";
        canvas.setAttribute("width", canvasWidth);
        canvas.setAttribute("height", canvasHeight);

        var ctx = canvas.getContext("2d");

        semitruckv1(ctx, canvasWidth);
    }

    function semitruckv1(ctx, canvasWidth) {
        //347 default width of initial image

        var resizeRatio = canvasWidth/347;
      // semitruckv1/Path
      ctx.save();
      ctx.beginPath();
      ctx.moveTo(251.3*resizeRatio, 143.8*resizeRatio);
      ctx.bezierCurveTo(251.3*resizeRatio, 146.9*resizeRatio, 253.9*resizeRatio, 149.5*resizeRatio, 257.0*resizeRatio, 149.5*resizeRatio);
      ctx.bezierCurveTo(260.2*resizeRatio, 149.5*resizeRatio, 262.8*resizeRatio, 146.9*resizeRatio, 262.8*resizeRatio, 143.8*resizeRatio);
      ctx.bezierCurveTo(262.8*resizeRatio, 140.6*resizeRatio, 260.2*resizeRatio, 138.1*resizeRatio, 257.0*resizeRatio, 138.1*resizeRatio);
      ctx.bezierCurveTo(253.9*resizeRatio, 138.1*resizeRatio, 251.3*resizeRatio, 140.6*resizeRatio, 251.3*resizeRatio, 143.8*resizeRatio);
      ctx.closePath();
      ctx.strokeStyle = "rgb(1, 1, 1)";
      ctx.lineWidth = 1*resizeRatio;
      ctx.stroke();

      // semitruckv1/Path
      ctx.beginPath();
      ctx.moveTo(243.3*resizeRatio, 143.8*resizeRatio);
      ctx.bezierCurveTo(243.3*resizeRatio, 151.4*resizeRatio, 249.5*resizeRatio, 157.5*resizeRatio, 257.0*resizeRatio, 157.5*resizeRatio);
      ctx.bezierCurveTo(264.6*resizeRatio, 157.5*resizeRatio, 270.8*resizeRatio, 151.4*resizeRatio, 270.8*resizeRatio, 143.8*resizeRatio);
      ctx.bezierCurveTo(270.8*resizeRatio, 136.2*resizeRatio, 264.6*resizeRatio, 130.1*resizeRatio, 257.0*resizeRatio, 130.1*resizeRatio);
      ctx.bezierCurveTo(249.5*resizeRatio, 130.1*resizeRatio, 243.3*resizeRatio, 136.2*resizeRatio, 243.3*resizeRatio, 143.8*resizeRatio);
      ctx.closePath();
      ctx.lineWidth = 1*resizeRatio;
      ctx.stroke();

      // semitruckv1/Path
      ctx.beginPath();
      ctx.moveTo(241.3*resizeRatio, 143.8*resizeRatio);
      ctx.bezierCurveTo(241.3*resizeRatio, 152.5*resizeRatio, 248.3*resizeRatio, 159.6*resizeRatio, 257.0*resizeRatio, 159.6*resizeRatio);
      ctx.bezierCurveTo(265.7*resizeRatio, 159.6*resizeRatio, 272.8*resizeRatio, 152.5*resizeRatio, 272.8*resizeRatio, 143.8*resizeRatio);
      ctx.bezierCurveTo(272.8*resizeRatio, 135.1*resizeRatio, 265.7*resizeRatio, 128.0*resizeRatio, 257.0*resizeRatio, 128.0*resizeRatio);
      ctx.bezierCurveTo(248.3*resizeRatio, 128.0*resizeRatio, 241.3*resizeRatio, 135.1*resizeRatio, 241.3*resizeRatio, 143.8*resizeRatio);
      ctx.closePath();
      ctx.lineWidth = 0.3*resizeRatio;
      ctx.stroke();

      // semitruckv1/Path
      ctx.beginPath();
      ctx.moveTo(232.5*resizeRatio, 143.8*resizeRatio);
      ctx.bezierCurveTo(232.5*resizeRatio, 157.3*resizeRatio, 243.5*resizeRatio, 168.3*resizeRatio, 257.0*resizeRatio, 168.3*resizeRatio);
      ctx.bezierCurveTo(270.6*resizeRatio, 168.3*resizeRatio, 281.6*resizeRatio, 157.3*resizeRatio, 281.6*resizeRatio, 143.8*resizeRatio);
      ctx.bezierCurveTo(281.6*resizeRatio, 130.2*resizeRatio, 270.6*resizeRatio, 119.3*resizeRatio, 257.0*resizeRatio, 119.3*resizeRatio);
      ctx.bezierCurveTo(243.5*resizeRatio, 119.3*resizeRatio, 232.5*resizeRatio, 130.2*resizeRatio, 232.5*resizeRatio, 143.8*resizeRatio);
      ctx.closePath();
      ctx.lineWidth = 0.5*resizeRatio;
      ctx.stroke();

      //THERE ARE ABOUT ANOTHER 800 LINES OF PATH DRAWING DOWNLOAD THE FULL SOURCE TO VIEW: www.epixseo.com/fullsource.txt

    }
  </script>
 </head>
 <body onLoad="init()">
   <canvas id="canvas"></canvas>
 </body>
</html>

Ответы [ 3 ]

5 голосов
/ 14 февраля 2012

Контекст холста имеет функцию scale, которая автоматически масштабирует все, что нарисовано на холсте, до тех пор, пока контекст не будет восстановлен, или вы не измените масштаб обратно на 1. См. https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Canvas_tutorial/Transformations#A_scale_example

0 голосов
/ 16 мая 2014

лучший способ справиться с этим зависит от ваших будущих приложений, например:

  1. Если вы просто рисуете тот же грузовик, но хотите перерисовать его при изменении размера страницы, вместо этого используйте метод toDataURL холста, чтобы вытянуть изображение холста, затем измените размер холста (используя .width и. height вместо css, потому что вы будете растягивать изображение), затем используйте метод drawImage , чтобы отрисовать URL-адрес данных обратно на холст (или просто поместите его в тег img).
  2. Если вы планируете анимировать часть грузовика, например колеса, вам следует использовать ту же стратегию, что и на первом этапе, но вместо того, чтобы вытягивать изображение грузовика, вытягивайте только части. Например, если вы анимируете колеса: потяните изображение основного корпуса грузовика, затем потяните изображение только колеса, затем нарисуйте грузовик один раз при изменении размера, но затем непрерывно перерисовывайте колеса, слегка поворачивая их каждый кадр.
0 голосов
/ 14 февраля 2012

Я не очень разбираюсь в использовании canvas (у меня GameMaker: HTML5 сделает это за меня), но разве вы не можете просто загрузить изображение SVG и нарисовать его в соответствующем размере?

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