渐变是指在颜色集上使用逐步抽样算法,并将结果应用于描边样式和填充样式中。使用渐变需要三个步骤:
(1) 创建渐变对象;
(2) 为渐变对象设置颜色,指明过渡方式;
(3) 在context上为填充样式或者描边样式设置渐变。
可以将渐变看做是颜色沿着一条线进行缓慢地变化。例如,如果为渐变对象提供了A、B两个点,不论是绘制还是填充,只要从A移动到B,都会带来颜色的变化。
要设置显示哪种颜色,在渐变对象上使用addColorStop函数即可。这个函数允许指定两个参数:颜色和偏移量。颜色参数是指开发人员希望在偏移位置描边或填充时所使用的颜色。偏移量是一个0.0到1.0之间的数值,代表沿着渐变线渐变的距离有多远。
假如要建立一个从点(0,0)到点(0,100)的渐变,并指定在0.0偏移位置使用白色,在1.0偏移位置使用黑色。当使用绘制或者填充的动作从(0,0)画到(0,100)后,就可以看到颜色从白色(起始位置)渐渐转变成了黑色(终止位置)。
除了可以变换成其他颜色外,还可以为颜色设置alpha值(例如透明),并且alpha值也是可以变化的。为了达到这样的效果,需要使用颜色值的另一种表示方法,例如内置alpha组件的CSS rgba函数。
下面我们通过示例来详细了解如何使用两个渐变来填充(相应的函数为fillRect)矩形区域,并形成最终的树干,见代码清单2-16。
代码清单2-16 使用渐变
- // 创建用作树干纹理的三阶水平渐变
- 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);
除了我们刚才用到的线性渐变以外,HTML5 Canvas API还支持放射性渐变,所谓放射性渐变就是颜色会介于两个指定圆间的锥形区域平滑变化。放射性渐变和线性渐变使用的颜色终止点是一样的,不过参数如代码清单2-17所示。
代码清单2-17 使用放射性渐变的示例
- createRadialGradient(x0, y0, r0, x1, y1, r1)
代码中,前三个参数代表以(x0,y0)为圆心,r0为半径的圆,后三个参数代表以(x1,y1)为圆心,r1为半径的另一个圆。渐变会在两个圆中间的区域出现。