2012-02-13 65 views
3

我已经使用HTML5画布中的路径创建了卡车绘图。画布图像本身接近900行代码,我已经实现了一个函数来根据窗口宽度/高度确定的调整比例来绘制图像。最终结果是画布和画布内的所有元素都会动态调整大小以适应窗口的内容。动态调整复杂的画布路径HTML5

请记住,我只是在第二天使用画布,所以我可能错过了一些东西,但必须有一个更简单的方法来完成我正在做的事情。所以,我的问题是:当涉及复杂路径时,是否有更简单的方法来实现画布及其内部元素的大小调整?

我的代码示例如下,只调整大小的身体负荷,我没有它连接到听者的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对于本教程,我看过之前的规模,但在阅读完该教程后,规模似乎是我应该前进的方向,我明天生病了,如果这是我需要你的答案,谢谢你抽出时间 – 2012-02-13 23:49:40

+0

我能够用scale来达到我期待的结果,感谢您的帮助 – 2012-02-14 15:23:01

0

我对使用画布不太了解(我有GameMaker:HTML5是为我做的),但是不能只是加载一个SVG图像并以适当的大小绘制它?

+0

这是作为一个移动应用程序进行部署,不幸的是,android和SVG并不相处,否则我会喜欢使用SVG,但不能在这种情况下,所以我不得不诉诸于帆布 – 2012-02-13 22:58:44

0

来处理这种依赖的最好办法对你未来的应用实例:

  1. 如果你是刚刚绘制同一辆卡车,但要重绘时页面大小,而不是使用画布toDataURL方法拉画布的图像,然后调整画布(使用.width和.height,而不是css,因为你会拉伸im年龄),然后使用drawImage方法将该数据url绘制回画布(或者将其填充到img标签中)。
  2. 如果您打算为卡车的一部分制作动画,例如轮子,则应使用与第一步相同的策略,但不要拉动卡车的图像拉动件。例如,如果您在制作车轮动画:拉出卡车主体的图像,然后拉出轮子的图像,然后在调整大小时拖动卡车,但是随后不断地重新绘制轮子,使其每帧都稍微旋转一下。