Do what you do

canvas元素简易教程(4)(大部分转自火狐,自己只写了简单的代码分析)

总结一下,我们已经学习了三种矩形的绘制方法了。那么,除了上面提到的三个方法可以直接绘制矩形之外,我们还有一个rect方法是用于绘制矩形路径的。

rect(x, y, width, height)

它接受四个参数x和y是其左上角坐标,width和height是其宽和高。

当它被调用时,moveTo 方法会自动被调用,参数为(0,0),于是起始坐标又恢复成初始原点了。

好了,我们讲述了这么多钟路径的绘图方法,但是现在所有的例子都只有一种路径的写法。难道你不遗憾么?好的,让我们来一起走进一个一堆路径的恶心人的东西吧。。。上代码:

function draw() {

  var ctx = document.getElementById('canvas').getContext('2d');

  roundedRect(ctx,12,12,150,150,15);

  roundedRect(ctx,19,19,150,150,9);

  roundedRect(ctx,53,53,49,33,10);

  roundedRect(ctx,53,119,49,16,6);

  roundedRect(ctx,135,53,49,33,10);

  roundedRect(ctx,135,119,25,49,10);

 

  ctx.beginPath();

  ctx.arc(37,37,13,Math.PI/7,-Math.PI/7,false); 

  ctx.lineTo(31,37);

  ctx.fill();

  for(i=0;i<8;i++){

    ctx.fillRect(51+i*16,35,4,4);

  }

  for(i=0;i<6;i++){

    ctx.fillRect(115,51+i*16,4,4);

  }

  for(i=0;i<8;i++){

    ctx.fillRect(51+i*16,99,4,4);

  }

  ctx.beginPath();

  ctx.moveTo(83,116);

  ctx.lineTo(83,102);

  ctx.bezierCurveTo(83,94,89,88,97,88);

  ctx.bezierCurveTo(105,88,111,94,111,102);

  ctx.lineTo(111,116);

  ctx.lineTo(106.333,111.333);

  ctx.lineTo(101.666,116);

  ctx.lineTo(97,111.333);

  ctx.lineTo(92.333,116);

  ctx.lineTo(87.666,111.333);

  ctx.lineTo(83,116);

  ctx.fill();

  ctx.fillStyle = "white";

  ctx.beginPath();

  ctx.moveTo(91,96);

  ctx.bezierCurveTo(88,96,87,99,87,101);

  ctx.bezierCurveTo(87,103,88,106,91,106);

  ctx.bezierCurveTo(94,106,95,103,95,101);

  ctx.bezierCurveTo(95,99,94,96,91,96);

  ctx.moveTo(103,96);

  ctx.bezierCurveTo(100,96,99,99,99,101);

  ctx.bezierCurveTo(99,103,100,106,103,106);

  ctx.bezierCurveTo(106,106,107,103,107,101);

  ctx.bezierCurveTo(107,99,106,96,103,96);

  ctx.fill();

  ctx.fillStyle = "black";

  ctx.beginPath();

  ctx.arc(101,102,2,0,Math.PI*2,true);

  ctx.fill();

  ctx.beginPath();

  ctx.arc(89,102,2,0,Math.PI*2,true);

  ctx.fill();

}

function roundedRect(ctx,x,y,width,height,radius){

  ctx.beginPath();

  ctx.moveTo(x,y+radius);

  ctx.lineTo(x,y+height-radius);

  ctx.quadraticCurveTo(x,y+height,x+radius,y+height);

  ctx.lineTo(x+width-radius,y+height);

  ctx.quadraticCurveTo(x+width,y+height,x+width,y+height-radius);

  ctx.lineTo(x+width,y+radius);

  ctx.quadraticCurveTo(x+width,y,x+width-radius,y);

  ctx.lineTo(x+radius,y);

  ctx.quadraticCurveTo(x,y,x,y+radius);

  ctx.stroke();

}

把函数贴进你的模板里,你会看到一个非常有趣的东西,不是么?什么?显示不出来?你确定你的浏览器支持么?确定?你确定你把同名的那几个其他的函数都改名字了么?哦哦哦,你看,我说什么来着。。。

来,让我们来看看这段代码。我觉得吧,你能看懂的,是吧。太长了,我实在懒得讲了。。。算了,我不讲估计你也不看。听我讲吧:

roundedRect函数的作用是什么?只有一个,画出一个圆角矩形。第二三个参数是坐标原点,第四五个参数是长宽,第六个参数是圆角弧度。

ctx.arc(37,37,13,Math.PI/7,-Math.PI/7,false)画出了左上角的一个缺了一角填充的圆弧,ctx.lineTo(34,37)在圆形结束点画出了一条线,画到圆心,然后用fill方法填充圆心与圆弧的另一头,成一个张嘴的圆形。

之后的三个for循环,分别画出了一堆横竖的小点,并对之填充。

最后就是一堆曲线与直线的填充调整了,我相信大家都需要对之仔仔细细的研读(我真的看不下去了),大体的思路就是先用lineTo函数进行轮廓的线条勾勒,然后再进行平滑曲线的无数次描边填充。作者应该也是实验了很久才将这种复杂的图案绘制成功吧。我们今天所学的就先到这里,希望大家可以继续。下次我将继续对canvas中应用图像进行介绍,希望大家喜欢,谢谢~~~

posted @ 2012-03-15 13:50  key yao  阅读(287)  评论(0编辑  收藏  举报
学会做事 学会做人