canvas基础——绘制简单的图形

绘制直线:

HTML部分:

1 <canvas id="myCanvas" style="border:1px solid #000;" width="200px" height="100px"></canvas>

JS部分:

1 window.onload = function(){
2     var c = document.getElementById('myCanvas');
3     var context = c.getContext('2d');
4     context.moveTo(0,0);    //起点坐标
5     context.lineTo(200,100);  //终点坐标
6     context.stroke();        //绘制直线
7 };

绘制直线中使用了3个方法:moveTo,lineTo和stroke.

其中moveTo方法用于创建新的子路径,并规定起始坐标点为(x,y),即moveTo(x,y);

linTo方法用于从moveTo方法规定的起始坐标点开始绘制一条到规定坐标的直线,即lineTo(x,y);

上面两个方法规定了直线路径的起点和终点,而stroke方法用于沿着该路径绘制一条直线。

 

绘制矩形:

JS代码:

1 var c = document.getElementById('myCanvas');
2     var context = c.getContext('2d');
3     context.fillStyle = 'red';
4     context.fillRect(0,0,100,50);
5     context.strokeStyle = 'white';
6     context.strokeRect(0,0,50,25);

在上面的代码中,fillStyle属性用于指定要绘制的图形的填充颜色,而fillRect方法用于以指定的颜色填充一个矩形,括号中的参数用于指定矩形的坐标位置和大小。

fill是填充,stroke是轮廓,所以用strokeStyle和strokeRect方法绘制矩形轮廓。

 

绘制圆形:

1 var c = document.getElementById('myCanvas');
2     var context = c.getContext('2d');
3     context.fillStyle = 'red';
4     context.beginPath();
5     context.arc(100,75,50,0,Math.PI*2,true);
6     context.closePath();
7     context.fill();

圆形的绘制仍然是采用路径并填充颜色的方法。

beginPath():开始绘制路径

closePath():用于结束绘制路径

arc():用于绘制圆形

用法:context.ar(x,y,radius,startAngle,endAngle,anticlockwise)

arc方法本意是绘制弧线,当采用适当的参数后即可绘制圆形,参数中的x,y为起点坐标,radius为圆形的半径,startAngle为开始的角度,

endAngle为结束的角度,anticlockwise为是否逆时针(true)为逆时针,(false)为顺时针方向进行绘制。

绘制圆弧实例

1 var c = document.getElementById('myCanvas');
2     var context = c.getContext('2d');
3     for(var i = 0; i<10; i++){
4         context.strokeStyle = 'red';
5         context.beginPath();
6         context.arc(0,150,i*15,0,Math.PI*3/2,true);
7         //context.closePath();
8         context.stroke();    
9     }

这里最后一句的stroke方法用于在显示设备中输出线条,这里少了一句closePath,即没有闭合路径。

 

绘制三角形:

 1 var c = document.getElementById('myCanvas');
 2     var context = c.getContext('2d');
 3      context.fillStyle = 'red';
 4     context.beginPath();
 5     context.moveTo(25,25);
 6     context.lineTo(150,25);
 7     context.lineTo(25,150);
 8     context.closePath();
 9     context.fill();
10     //context.strokeStyle = 'blue';
11     //context.stroke();
12 };

通过4到8行之间的代码,实现三角路径的绘制。

 

清空画布

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>canvas基础2</title>
<script>
window.onload = function(){
    var oBtn = document.getElementById('btn');
    var c = document.getElementById('myCanvas');
    var context = c.getContext('2d');
    
    //画条弧线
    context.strokeStyle = 'red';
    context.beginPath();
    context.arc(200,150,100,-Math.PI*1/6,-Math.PI*5/6,true);
    context.stroke();
    
    //清空画布
    oBtn.onclick = function(){
        context.clearRect(0,0,300,200);    
    };    
};
</script>
</head>

<body>
<canvas id="myCanvas" width="300px" height="200px" style="border:1px solid #000"></canvas>
<br/>
<input id="btn" type="button" value="清空画布">
</body>
</html>

使用clearRect方法可清除指定的矩形区域内的所有图形。该方法是:context.clearRect(x,y,width,height)。

 

绘制贝塞尔曲线

绘制二次方贝塞尔曲线

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>canvas基础2</title>
<script>
window.onload = function(){
    var c = document.getElementById('myCanvas');
    var context = c.getContext('2d');
    
    //绘制二次方贝塞尔曲线
    context.strokeStyle = 'red';
    context.beginPath();
    context.moveTo(0,200);
    context.quadraticCurveTo(75,50,300,200);
    context.stroke();
    context.globalCompositeOperation = 'source-over';
    
    //下面绘制的直线用于表示上面曲线的控制点(两直线的交点)和控制线
    context.strokeStyle = 'green';
    context.beginPath();
    context.moveTo(75,50);
    context.lineTo(0,200);
    context.moveTo(75,50);
    context.lineTo(300,200);
    context.stroke();
      
};
</script>
</head>

<body>
<canvas id="myCanvas" width="300px" height="200px" style="border:1px solid #000"></canvas>
</body>
</html>

quadraticCurveTo方法用于绘制贝塞尔曲线,用法:context.quadraticCurveTo(cplx,cply,x,y);

其中参数cplx和cply是控制点坐标,x和y是终点坐标。

globalCompositeOperation 属性设置或返回如何将一个源(新的)图像绘制到目标(已有的)的图像上。

源图像 = 您打算放置到画布上的绘图。

目标图像 = 您已经放置在画布上的绘图。

属性值

描述
source-over 默认。在目标图像上显示源图像
source-atop 目标图像顶部显示源图像源图像位于目标图像之外的部分是不可见的。
source-in 目标图像中显示源图像。只有目标图像之内的源图像部分会显示,目标图像是透明的。
source-out 目标图像之外显示源图像。只有目标图像之外的源图像部分会显示,目标图像是透明的。
destination-over 源图像上显示目标图像
destination-atop 源图像顶部显示目标图像目标图像位于源图像之外的部分是不可见的。
destination-in 源图像中显示目标图像。只有源图像之内的目标图像部分会被显示,源图像是透明的。
destination-out 源图像之外显示目标图像。只有源图像之外的目标图像部分会被显示,源图像是透明的。
lighter 显示源图像 + 目标图像
copy 显示源图像。忽略目标图像
xor 使用异或操作对源图像目标图像进行组合。

 

 

 
 

 

 

 

 

 

 

 

实例

所有 globalCompositeOperation 属性值:

<html>
<head>
<style>
canvas
{
border:1px solid #d3d3d3;
margin-right:10px;
margin-bottom:20px;    
}
</style>
</head>
<body>

<script>

var gco=new Array();
gco.push("source-atop");
gco.push("source-in");
gco.push("source-out");
gco.push("source-over");
gco.push("destination-atop");
gco.push("destination-in");
gco.push("destination-out");
gco.push("destination-over");
gco.push("lighter");
gco.push("copy");
gco.push("xor");
for (n=0;n<gco.length;n++)
    {
    document.write("<div id='p_" + n + "' style='float:left;'>" + gco[n] + ":<br>");
    var c=document.createElement("canvas");
    c.width=120;
    c.height=100;
    document.getElementById("p_" + n).appendChild(c);
    var ctx=c.getContext("2d");    
    ctx.fillStyle="blue";
    ctx.fillRect(10,10,50,50);
    ctx.globalCompositeOperation=gco[n];
    ctx.beginPath();
    ctx.fillStyle="red";
    ctx.arc(50,50,30,0,2*Math.PI);
    ctx.fill();
    document.write("</div>");    
    }

</script>

</body>
</html>
            

 

绘制三次方贝塞尔曲线

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>canvas基础3</title>
<script>
window.onload = function(){
    var c = document.getElementById('myCanvas');
    var context = c.getContext('2d');
    
    //绘制三次方贝塞尔曲线
    context.strokeStyle = 'red';
    context.beginPath();
    context.moveTo(0,200);
    context.bezierCurveTo(25,50,75,50,300,200);
    context.stroke();
    context.globalCompositeOperation = 'source-over';
    
    //下面绘制的直线用于表示上面曲线的控制点(两直线的交点)和控制线
    context.strokeStyle = 'green';
    context.beginPath();
    context.moveTo(25,50);
    context.lineTo(0,200);
    context.moveTo(75,50);
    context.lineTo(300,200);
    context.stroke();
    
};
</script>
</head>

<body>
<canvas id="myCanvas" width="300px" height="200px" style="border:1px solid #000"></canvas>
</body>
</html>

bezierCurveTo方法用于绘制三次方贝塞尔曲线,用法:context.bezierCurveTo(cplx,cply,cp2x,cp2y,x,y);

其中参数cplx和cply是第一个控制点的坐标,cp2x和cp2y是第二个控制点的坐标,x和y是终点的坐标。

 

相关参考:http://www.w3cschool.cc/jsref/prop-canvas-globalcompositeoperation.html

 

posted @ 2014-11-26 00:37  波克比520  阅读(559)  评论(0编辑  收藏  举报