2012-02-13 6 views
3

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

Имейте в виду, что я нахожусь только на 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> 

ответ

4

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

+0

+1 для учебника я видел масштаб раньше, но после прочтения этого урока масштаб, похоже, будет направлением, в котором я должен возглавить, плохо дать ему выстрел завтра, и если это то, что мне нужно, вы получили ответ, спасибо, что нашли время –

+0

Я смог использовать шкалу для достижения результата, который я искал, спасибо за помощь –

0

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

+0

Это развертывается как мобильное приложение, и, к сожалению, андроид и SVG пока не ладят, в противном случае я бы хотел использовать SVG, но не могу в этом случае, поэтому мне пришлось прибегнуть к холсту –

0

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

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