HTml5 Canvas 整理笔记之图形变换
2016-04-12 23:30
381 查看
先提出:为啥要图形变换?
先回答:对图形的变化不单单是单纯的“迎合”视觉,更大的用处在于代码的复用,绘制完基础图形之后,可以调用它进行复用,单纯的复用是不是很单调,通过图形变换则使画面更加精彩,比如你只画了一个树,起就能通过代码复用加图形变换拥有一片绚丽的森林。
进入主题
sy:纵向缩放比例
对于位移和缩放给出下面代码做示例:
结果如下:
restore()
它们(要配对使用,最好要养成习惯,反正加了没有坏处)的作用就是对图形变换状态的保存和恢复,因为在有些情况下你会做很多图形变换,translate(x,y) 、scale(sx,sy)、rotate(deg)会有叠加现象(会相互影响)。
如下:
代码:
没加 save()和restore()之前
加 save()和restore()之后
原图
水平缩为原来的0.5倍
使用settransform可以避免叠加,相当于重新开始set一遍
设置setTransform之前
替换为setTransform之后、
它会把前面设置的图形变换都清除!!
先回答:对图形的变化不单单是单纯的“迎合”视觉,更大的用处在于代码的复用,绘制完基础图形之后,可以调用它进行复用,单纯的复用是不是很单调,通过图形变换则使画面更加精彩,比如你只画了一个树,起就能通过代码复用加图形变换拥有一片绚丽的森林。
进入主题
1.位移translate(x,y)
默认坐标的(0,0)点是画布(canvas)的左上定点,你画图形和曲线的是以它为基准,translate()的功能就是改变图形的基准点((0,0)点),这样你能平移所画的东西。2.缩放scale(sx,sy)
sx:在横向缩放比例sy:纵向缩放比例
对于位移和缩放给出下面代码做示例:
<canvas id="tails" width=400 height=600 style="border: 1px slateblue dashed;display: block;margin: 50px auto;"> <script> var canvas = document.getElementById("tails"); var context = canvas.getContext('2d'); //画文字 context.textAlign="center"; context.fillStyle="green"; context.font="bold 50px Arial"; context.fillText("Happy Trails!",200,50); //先画个小树 DrawTreen(context,1,1,130, 250); //再画一个大树 DrawTreen(context,1.4,1.4,200,500); context.save(); context.translate(-10, 350); context.beginPath(); context.moveTo(0, 0); context.quadraticCurveTo(170, -50, 260, -190); context.quadraticCurveTo(310, -250, 410, -250); context.strokeStyle = 'chocolate'; context.lineWidth = 20; context.stroke(); context.restore(); //画树函数 function DrawTreen(context,x1,y1,x2,y2) { DrawShadow(context,x1,y1,x2,y2); context.save(); context.translate(x2,y2); context.scale(x1,y1); context.shadowBlur = 14; context.beginPath(); context.moveTo(-25, -50); context.lineTo(-10, -80); context.lineTo(-20, -80); context.lineTo(-5, -110); context.lineTo(-15, -110); context.lineTo(0, -140); context.lineTo(15, -110); context.lineTo(5, -110); context.lineTo(20, -80); context.lineTo(10, -80); context.lineTo(25, -50); context.closePath(); context.fillStyle = 'green'; context.fill(); context.fillStyle = 'black' context.fillRect(-5, -50, 10, 50); context.stroke(); context.restore(); } //画阴影 function DrawShadow(context,x1,y1,x2,y2){ context.save(); context.translate(x2,y2); context.scale(x1,y1); context.transform(1, 0, -0.5, 0.6, 0, 0) context.beginPath(); context.moveTo(-25, -50); context.lineTo(-10, -80); context.lineTo(-20, -80); context.lineTo(-5, -110); context.lineTo(-15, -110); context.lineTo(0, -140); context.lineTo(15, -110); context.lineTo(5, -110); context.lineTo(20, -80); context.lineTo(10, -80); context.lineTo(25, -50); context.closePath(); context.fillStyle = 'rgba(0, 0, 0,0.3)'; context.fill(); context.fillStyle = 'rgba(0, 0, 0, 0.3)' context.fillRect(-5, -50, 10, 50); // context.stroke(); context.restore(); } </script> </canvas>
结果如下:
3.旋转rotate(deg)
旋转就是绕基准点((0,0)点)旋转特定角度,至于可以做什么自己可以思考,你如时钟的刻度,动态的旋转某一物体等。温馨提醒Cavans的保存和恢复:
save()restore()
它们(要配对使用,最好要养成习惯,反正加了没有坏处)的作用就是对图形变换状态的保存和恢复,因为在有些情况下你会做很多图形变换,translate(x,y) 、scale(sx,sy)、rotate(deg)会有叠加现象(会相互影响)。
如下:
代码:
没加 save()和restore()之前
加 save()和restore()之后
4.transform(a,b,c,d,e,f)
原图
水平缩为原来的0.5倍
使用settransform可以避免叠加,相当于重新开始set一遍
设置setTransform之前
替换为setTransform之后、
它会把前面设置的图形变换都清除!!
相关文章推荐
- HTML5元素
- h5的瀑布流
- HTML5语义化实现方式(兼容)
- html5-canvas
- 基于cdh5.4.2的Zeppelin编译安装
- 【发布】JEECG-P3 新主题后台风格(H5扁平化)
- HTML5&CSS3:[1]如何使用Flexbox伸缩盒
- HTML5 语义元素(一)页面结构
- HTML5新特性之离线缓存技术
- 判断用户是否在看当前网页以及判断某个元素是否在网页可视区域
- 判断用户是否在看当前网页以及判断某个元素是否在网页可视区域
- HTML5 地理定位
- HTML5火焰文字特效DEMO演示---转载
- 将HTML5 Canvas的内容保存为图片借助toDataURL实现
- html5拖拽
- HTML5之FileReader的使用
- HTML5 内联 SVG
- HTML5中的服务器‘推送’技术 -Server-Sent Events
- 去除HTML5 SUMMARY 标签前的三角形
- html5生成柱状图(条形图)