canvas变换方法原理探究
2016-12-17 本文已影响60人
Kagashino
下午就考六级了,现在还闲不住。。。。
我们今天讲解画布对象3种变换方法:
scale,对x,y两个方向进行比例缩放
translate,平移
rotate,旋转
先来个矩形,再画2条基线:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>画布变换规律探究</title>
</head>
<body>
<canvas id="cvs1" width="400" height="400" style="background:#6cf">你的浏览器是低版本的IE?太不幸了,换一个吧</canvas>
</body>
<script>
var ctx = document.getElementById('cvs1').getContext('2d');
ctx.strokeStyle = "black";
ctx.strokeRect(0,10,400,0);
ctx.strokeRect(10,0,0,400);
ctx.fillStyle="#d33";
ctx.fillRect(10,10,40,100);
</script>
</html>
![](https://img.haomeiwen.com/i3132311/4cac27c7e8c3bd6a.png)
我们在参考线渲染之后加入scale方法,使得矩形渲染之前变换:
![](https://img.haomeiwen.com/i3132311/988aafdf862cdac4.png)
得到的是这个:
![](https://img.haomeiwen.com/i3132311/056dd6eae601ea08.png)
我们发现,用scale方法对X轴进行拉伸时,矩形的位置也偏移了,为什么呢?
原因:scale方法是针对整个画布缩放,缩放参考点默认在左上角
假如我们把矩形放在左上角渲染,scale不变:
![](https://img.haomeiwen.com/i3132311/19722b605c751b52.png)
![](https://img.haomeiwen.com/i3132311/5ce559d528724c97.png)
可以看到,方形位置不偏移了,验证了我们所说:<strong>“scale参考点默认在左上角”</strong>的说法
接下来我们使用translate方法偏移整个画布:
![](https://img.haomeiwen.com/i3132311/8630da53e631ebe5.png)
![](https://img.haomeiwen.com/i3132311/0db165b7659d1098.png)
可以看到,矩形位置也不再像第一次那样偏移,因为锚点、矩形跟随着整个画布移动了
核心结论:scale、translate方法都是作用在画布而不是里面的某个图形中
特别说明一点,两条基准线是在我使用变换方法之前渲染的,渲染之后所有的方法都对基线无效!
同样的的原理也适用于rotate方法:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>画布原理</title>
</head>
<body>
<canvas id="cvs1" width="400" height="400" style="background:#ddf">你的浏览器是低版本的IE?太不幸了,换一个吧</canvas>
</body>
<script>
var ctx = document.getElementById('cvs1').getContext('2d');
ctx.strokeStyle = "black";
ctx.strokeRect(0,200,400,0);//把线移到画布中央
ctx.strokeRect(200,0,0,400);
ctx.fillStyle="#d33";
ctx.fillRect(200,200,40,100);//矩形也跟着落在画布中央
</script>
</html>
![](https://img.haomeiwen.com/i3132311/37739fff9afa86ae.png)
加入rotate方法,顺时针偏移10度:
![](https://img.haomeiwen.com/i3132311/588d1e5a4b45175f.png)
![](https://img.haomeiwen.com/i3132311/86107fee622bcd7c.png)
那么我们对画布做了什么呢?请看下面:
![](https://img.haomeiwen.com/i3132311/5a422d7d16e019dd.gif)
如果我们把画布也偏移到200,200的地方,
![](https://img.haomeiwen.com/i3132311/a14c403efa68d1de.png)
![](https://img.haomeiwen.com/i3132311/f58ec6f0ddf78476.png)
相当于这样(6M的GIF...):
![](https://img.haomeiwen.com/i3132311/61bd1eab5e2a0b8a.gif)
如果上述translate、scale、rotate方法执行多次,那么会一直叠加,想想看下面的图形都是怎么做出来的?
![](https://img.haomeiwen.com/i3132311/2554d734c641486a.png)
![](https://img.haomeiwen.com/i3132311/753ed9f43ab79e05.png)
下期给答案
如果看完以后理解了,记得给个❤,谢谢