html5 Canvas的轉(zhuǎn)換方法,在線(xiàn)實(shí)例演示如何使用html5 Canvas進(jìn)行旋轉(zhuǎn)、移動(dòng)、縮放,圍繞不同點(diǎn)旋轉(zhuǎn),縮放比例設(shè)置等。 您可以將轉(zhuǎn)換應(yīng)用于HTML5畫(huà)布上繪制的任何內(nèi)容。這是您可以應(yīng)用的轉(zhuǎn)換的列表: 移動(dòng)(移動(dòng)繪制的內(nèi)容) 本文中介紹所有這些轉(zhuǎn)換 轉(zhuǎn)換矩陣可以在2D上下文中設(shè)置轉(zhuǎn)換矩陣。此矩陣將乘以畫(huà)布上繪制的所有內(nèi)容。對(duì)于本教程中使用的示例,我將其設(shè)置為“身份”矩陣,該矩陣乘以x,y坐標(biāo)集后得出x,y。換句話(huà)說(shuō),不進(jìn)行任何轉(zhuǎn)換。 context.setTransform(1, 0, 1, 0); 移動(dòng)可以將移動(dòng)應(yīng)用于畫(huà)布上繪制的所有內(nèi)容。移動(dòng)意味著所畫(huà)內(nèi)容的重定位。這是您在代碼中設(shè)置移動(dòng)的方式: var x = 100;var y = 50; context.translate(x, y); 本示例將在畫(huà)布上繪制的所有形狀在x軸上移動(dòng)100,在y軸上移動(dòng)50。 <canvas id="ex1" width="500" height="150" style="border: 1px solid #cccccc;"> HTML5 Canvas not supported </canvas> <script> var canvas = document.getElementById("ex1"); var context = canvas.getContext("2d"); context.fillStyle = "#ff0000"; context.fillRect(10,10, 100, 100); context.translate(50, 25); context.fillStyle = "#0000ff"; context.fillRect(10, 100); </script> 這是在畫(huà)布上繪制時(shí)的結(jié)果: 旋轉(zhuǎn)您可以將自動(dòng)旋轉(zhuǎn)應(yīng)用于在HTML5畫(huà)布上繪制的任何形狀。這是通過(guò)rotate()2D上下文上的功能完成的 。這是一個(gè)簡(jiǎn)單的示例: context.rotate(radians); 旋轉(zhuǎn)角度作為參數(shù)傳遞給rotate()函數(shù)。該值必須以弧度而不是度為單位。 <canvas id="ex2" width="500" height="150" style="border: 1px solid #cccccc;"> HTML5 Canvas not supported </canvas> <script> var canvas = document.getElementById("ex2"); var context = canvas.getContext("2d"); context.fillStyle = "#ff0000"; context.fillRect(10, 100); context.rotate( (Math.PI / 180) * 25); //rotate 25 degrees. context.fillStyle = "#0000ff"; context.fillRect(10, 100); </script> 這是在畫(huà)布上繪制矩形時(shí)的外觀: 圍繞不同點(diǎn)旋轉(zhuǎn)如前所述,所有形狀都圍繞畫(huà)布(0,0)的左上角旋轉(zhuǎn)。但是,如果您希望形狀繞不同的點(diǎn)旋轉(zhuǎn)怎么辦?例如,圍繞其自身的中心旋轉(zhuǎn)形狀? <canvas id="ex3" width="500" height="150" style="border: 1px solid #cccccc;"> HTML5 Canvas not supported </canvas> <script> var canvas = document.getElementById("ex3"); var context = canvas.getContext("2d"); var x = 10; var y = 10; var width = 100; var height = 100 var cx = x + 0.5 * width; var cy = y + 0.5 * height; context.fillStyle = "#ff0000"; context.fillRect(x, y, width, height); context.translate(cx, cy); context.rotate( (Math.PI / 180) * 25); //rotate 25 degrees. context.translate(-cx, -cy); //set center back to 0,0 context.fillStyle = "#0000ff"; context.fillRect(x, height); </script> 這是在畫(huà)布上繪制時(shí)的外觀: 此示例首先將畫(huà)布的中心平移(移動(dòng))到正方形的中心(cx,cy)。然后將畫(huà)布旋轉(zhuǎn)25度。然后,它將畫(huà)布再次轉(zhuǎn)換回0,0。現(xiàn)在,畫(huà)布圍繞cx,cy旋轉(zhuǎn)了25度。您繪制的所有內(nèi)容都將圍繞cx,cy旋轉(zhuǎn)顯示。最終,該矩形被繪制為好像什么都沒(méi)發(fā)生一樣,但是現(xiàn)在它將圍繞cx,cy旋轉(zhuǎn)25度。這僅使用轉(zhuǎn)換調(diào)用即可實(shí)現(xiàn)。矩形的坐標(biāo)不變。請(qǐng)注意context.fillRect(),繪制紅色和藍(lán)色矩形的兩個(gè)調(diào)用是如何相同的。正是它們之間的轉(zhuǎn)換調(diào)用使它們出現(xiàn)在不同的位置和旋轉(zhuǎn)位置 縮放可以對(duì)在HTML5畫(huà)布上繪制的所有形狀應(yīng)用自動(dòng)縮放。 var scaleX = 2; var scaleY = 2; context.scale(scaleX, scaleY); 本示例將x軸和y軸上的所有坐標(biāo)縮放2倍。 <canvas id="ex5" width="500" height="250" style="border: 1px solid #cccccc;"> HTML5 Canvas not supported </canvas> <script> var canvas = document.getElementById("ex5"); var context = canvas.getContext("2d"); var x = 10; var y = 10; var width = 100; var height = 100 context.fillStyle = "#ff0000"; context.fillRect(x, height); context.scale(2,2); context.fillStyle = "#0000ff"; context.fillRect(x, height); </script> 這是在畫(huà)布上生成的grapichs: 請(qǐng)注意,藍(lán)色矩形的大小是紅色矩形的兩倍。 平移,旋轉(zhuǎn)和縮放組合當(dāng)然可以將所有三個(gè)轉(zhuǎn)換組合在同一畫(huà)布上。但是,就像組合旋轉(zhuǎn)和平移時(shí)一樣,對(duì)2D上下文進(jìn)行函數(shù)調(diào)用的順序也很重要。如果scale()在調(diào)用translate() 等之前調(diào)用,則結(jié)果看起來(lái)會(huì)有所不同。您可能需要對(duì)函數(shù)調(diào)用的順序進(jìn)行一些調(diào)整才能使其正確 |