Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[JavaScript] canvas实战 #25

Open
zgfang1993 opened this issue Aug 26, 2018 · 0 comments
Open

[JavaScript] canvas实战 #25

zgfang1993 opened this issue Aug 26, 2018 · 0 comments

Comments

@zgfang1993
Copy link
Owner

zgfang1993 commented Aug 26, 2018

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

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
功能:
画图、撤销、清空、改颜色、保存

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant