Canvas入门(二)

十四缩放canvas

 

还有一种需求就是同样一个树在页面中可能需要出现多次,现在我们来解决这个问题,我们把代码中用于绘制树的操作独立出来,当做一个单例的历程,称为drawTree。如下:绘制树对象的函数

//创建树对象绘制函数,以便重用

function drawTree(context){

//创建用作树干纹理的三阶水平渐变

var trunkGradient = context.createLinearGradient(-5,-50,5,-50);

//树干的左侧边缘是一般程度的棕色

trunkGradient.addColorStop(0,'#663300');

//树干中间偏左的位置颜色要淡一些

trunkGradient.addColorStop(0.4,"#996600");

//树干右侧边缘的颜色要深一些

trunkGradient.addColorStop(1,'#552200');

//使用渐变填充树干

context.fillStyle = trunkGradient;

context.fillRect(-5,-50,10,50);

//创建垂直渐变,一用作树冠在树干上投影

var canopyShadow = context.createLinearGradient(0,-50,0,0);

//投影渐变的起点是透明度设为50%的黑色

canopyShadow.addColorStop(0,'rgba(0,0,0,0.5)');

//方向向下垂直,渐变色在很短的距离内迅速渐变值完全透明,这段

//长度职位的树干上没有投影

canopyShadow.addColorStop(0.2,'rgba(0,0,0,0.0)');

//在树干上填充投影渐变

context.fillStyle = canopyShadow;

context.fillRect(-5,-50,10,50);

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.lineWidth = 4;

//平滑路径的接合点

context.lineJoin = 'round';

//将颜色改为绿色

context.strokeStyle = 'green';

context.stroke();

// 将填充颜色设置为绿色并填充树冠

context.fillStyle="#339900";

context.fill();

}

可以看到,drawTree函数包括了之前绘制树冠、树干和树干渐变的所有代码。为了在新位置画出大一点的树,我们将使用另一种变换方式——缩放函数context.scale,如下:

//在130,250的位置绘制第一课树

context.save();

context.translate(130,250);

drawTree(context);

context.restore();

 

//在260,500的位置绘制第二棵树

context.save();

context.translate(260,500);

 

//将第二棵树的宽和高分别放大至原来的2倍

context.scale(2,2);

drawTree(context);

context.restore();

scale函数带有两个参数类分别代表在x,y两个维度的值。每个参数在canvas显示图像的时候,向其传递在本方向轴上图像要放到(或者缩小)的量。如果x值为2,就代表所绘制图形中全部元素都会变成两倍宽,如果y值为0.5,绘制出来的图像都会变成之前的一半高

 

本教程由尚硅谷教育大数据研究院出品,如需转载请注明来源,欢迎大家关注尚硅谷公众号(atguigu)了解更多。