zgfang1993/blog

[JavaScript] canvas实战

Opened this issue · 0 comments

  • 基础知识
  • 实战(绘画小程序)

1. 基础知识

什么是canvas?

  • Canvas是一个可以使用脚本(通常为JavaScript)来绘制图形的HTML 元素.可以用于绘制图表、制作图片构图或者制作简单的(以及不那么简单的)动画.
  • Canvas 的默认大小为300像素×150像素
  • 通过html属性来设置宽高。css设置无效
<canvas id="tutorial" width="150" height="150"></canvas>

getContext()

获得渲染上下文和它的绘画功能

  • 参数只支持2d,暂不支持3d
  • getContext("2d") 对象是内建的 HTML5 对象,拥有多种绘制路径、矩形、圆形、字符以及添加图像的方法。

绘制矩形

  • fillRect(x,y,width,height) 填充矩形
  • strokeRect(x, y, width, height) 矩形边框
  • clearRect(x, y, width, height) 清除指定矩形区域

x与y指定了在canvas画布上所绘制的矩形的左上角(相对于原点)的坐标。width和height设置矩形的尺寸。

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

ctx.fillStyle = 'rgb(200,0,0,0.5)';
ctx.fillRect(25, 25, 100, 100);
ctx.clearRect(45, 45, 60, 60);
ctx.strokeStyle = 'rgba(0,0,200,0.5)'
ctx.strokeRect(50, 50, 50, 50);

image

绘制路径

  • beginPath() 新建一条路径
  • closePath() 关闭路径,头尾相连
  • stroke() 线条绘制路径
  • fill() 填充
// 绘制实心三角形
ctx.beginPath();
ctx.moveTo(20,20);
ctx.lineTo(20,100);
ctx.lineTo(70,100);
ctx.closePath();
ctx.stroke();

image

// 以上代码再加这两行 变实心
ctx.fillStyle="green";
ctx.fill();

image

移动笔触

  • moveTo(x, y) 将笔触移动到指定的坐标x以及y上。

一个非常有用的函数,而这个函数实际上并不能画出任何东西.
想象一下在纸上作业,一支钢笔或者铅笔的笔尖从一个点到另一个点的移动过程。

线

  • lineTo(x, y) 绘制直线

开始点和之前的绘制路径有关,之前路径的结束点就是接下来的开始点。
开始点也可以通过moveTo()函数改变。

组合使用的一个demo

function draw() {
 var canvas = document.getElementById('canvas');
 if (canvas.getContext){
 var ctx = 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(var 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();
}

image

2. 实战 (绘画)

image
功能:
画图、撤销、清空、改颜色、保存