Canvas学习笔记

Canvas 学习笔记

画布创建

<canvas id="myCanvas" width="200" height="100"></canvas>

绘制形状

如下图所示 canvas元素默认被网格所覆盖 通常来说 网格中的一个单元相当于canvas中的一像素 栅格起点为左上角 坐标为(0,0)所有元素的位置都相对于原点的定位

坐标和空间

image.png

绘制矩形

canvas只支持一种原生的图形绘制 就是矩形 其他图形都至少需要生成path ,不过我们拥有众多的路径(path)生成方法 让复杂的图形绘制成为了可能

canvas提供了三种方法绘制矩形

1. fillRect(x,y,w,h); 绘制一个填充的矩形

2. strokeRect(x,y,w,h); 绘制一个矩形的边框

3. clearRect(x,y,w,h); 清除指定矩形区域

参数说明 x,y 为矩形左上角的坐标 w,h为矩形的宽高

ctx.fillRect(10,10,100,50)
ctx.strokeRect(10, 70, 100, 50);
ctx.clearRect(15,15,50,25)

上方代码绘制效果

image.png

绘制路径

图形的基本元素是路径 路径是通过不同颜色和宽度的线段或曲线相连形成的不同形状的点的集合 一个路径乃至一个子路径都是闭合的

创建路径绘额外的步骤

1.创建路径的起始点

2.调用绘制方法去绘制路径

3.封闭路径

4.通过填充或描边填充路径渲染 图形

需要用到的方法

1. beginPath()

新建一条路径,路径一旦创建成果 图形绘制命令会被指向到路径上生成路径

2. moveTo(x,y)

将画笔移动到指定坐标(x,y)相当于设置路径的起始点坐标

3. closePath()

闭合路径之后 路径闭合好后 图形绘制命令又重新指向到上下文中

4. stroke()

通过线条来绘制图形轮廓

5. fill()

通过填充绘制路径的内容区域 形成实心图形

绘制线段

 ctx.beginPath(); //新建路径
 ctx.moveTo(50,50); //将画笔移动到指定坐标
 ctx.lineTo(200,50);//绘制一条从(50,50)到(200,50)的 线
 ctx.closePath();//闭合路径
 ctx.stroke(); //绘制路径
 ctx.draw()

绘制效果

image.png

绘制三角形

this.ctx.beginPath();
this.ctx.moveTo(50,50);
this.ctx.lineTo(200,50);
this.ctx.lineTo(200,200);
this.ctx.closePath();
this.ctx.stroke();
this.ctx.draw();
image.png

填充三角形

把上面代码中的 this.ctx.stroke(); 改成 this.ctx.fill(); 即可

image.png

绘制圆弧

有两个方法可以绘制圆弧

1. arc(x, y, r, star, end, anti);

以x,y为圆心 以r为半径 从 start弧度 开始 到end弧度结束 anti 传入布尔值 true表示逆时针 false表示顺时针

image.png
this.ctx.beginPath();
this.ctx.arc(50, 50, 40, 0, Math.PI * 0.5 , false);
this.ctx.stroke();
this.ctx.draw()

绘制效果

image.png

2. arcTo(x1, y1, x2, y2, r)

根据给定的控制点和半径话一段圆弧 最后再以直线连接两个控制点

this.ctx.beginPath();
this.ctx.moveTo(50,50);
this.ctx.arcTo(200, 50, 200, 200, 100);
this.ctx.lineTo(200,200)
this.ctx.stroke();
this.ctx.draw();
image.png

image.png

这个方法可以理解成 绘制的弧形是由两条切线所决定

第一条切线 起始点1 到控制点1 决定的直线

第二条切线 有控制点1 和控制点2 决定的直线

绘制的圆弧就是与这两条直线相切的圆弧

绘制贝塞尔曲线

贝塞尔曲线介绍

贝塞尔曲线又称为贝兹曲线或贝济埃曲线,是应用于二维图形应用程序的数学曲线,一般的矢量图形软件通过它来精确绘制出曲线 贝兹曲线由线段与节点组成 节点是可拖动的支点 线段是可伸缩的 我们在ps中使用的钢笔工具就是来做这种矢量曲线的 贝塞尔曲线是计算机图形中相当重要的参数曲线

常用贝塞尔曲线有以下几类

一次贝塞尔曲线

240px-b_1_big.gif

二次贝塞尔曲线

b_2_big.gif
1544764428-5713-240px-BC3A9zier-2-big.svg-.png

三次贝塞尔曲线

b_3_big.gif
image.png

绘制二次贝塞尔曲线

quadraticCurveTo(cpx,cpy,x,y)

参数说明 (cpx,cpy)控制点坐标 (x, y)结束点坐标;

 let controlPoint = [40,100];//控制点
 let startPoint = [10,200];//起始点
 let endPoint = [200,200]; //结束点

this.ctx.beginPath();
this.ctx.moveTo(startPoint[0],startPoint[1]);
this.ctx.quadraticCurveTo(controlPoint[0],controlPoint[1],endPoint[0],endPoint[1]);
this.ctx.stroke();

this.ctx.beginPath();
this.ctx.rect(startPoint[0], startPoint[1], 10, 10);
this.ctx.rect(controlPoint[0], controlPoint[1], 10, 10);
this.ctx.rect(endPoint[0], endPoint[1], 10, 10);
this.ctx.fill();
this.ctx.draw();

绘制效果如下

image
image.png

绘制三次贝塞尔曲线

bezierCurveTo(cpx,cpy,cpx2,cpy2,x,y)

image.png

参数说明 (cpx,cpy)控制点1坐标 (cpx2,cpy2)控制点2坐标(x, y)结束点坐标;

image.png

添加样式和颜色

在前面的绘制中只用到了默认的线条和颜色 如果想要给图形是上色 有两个重要的属性可以做到

fillStyle = color;

设置填充颜色

 for(let i=0 ;i<6;i++){
   for (let j = 0; j < 6; j++) {
     let r = Math.floor(255 - 42.5 * i);
     let g = Math.floor(255 - 42.5 * j);
     this.ctx.fillStyle = `rgb(${r},${g},0)`;
     console.log(`调试:输出方块 fillRect(${j*50},${i*50},50,50) 颜色为 rgb(${r},${g},0)`)
     this.ctx.fillRect(j*50 ,i*50 ,50,50);
   }
 }
this.ctx.draw();

绘制结果

image.png

strokeStyle = color;

设置边框颜色

for (let i = 1; i < 6; i++) {
  for (let j = 1; j < 6; j++) {
    let r = this.randomInt(0,255);//返回指定范围随机数randomInt = (from,to) => { parseInt(Math.random() * (to - from + 1) + from);}
    let g = this.randomInt(0,255);
    let b = this.randomInt(0,255);
    this.ctx.strokeStyle = `rgb(${r},${g},${b})`;
    this.ctx.strokeRect(j * 50, i * 50, 40, 40);
  }
}
this.ctx.draw();
image.png

line style 线条样式

lineWidth 线宽

起点和终点的 连线 为中心 上下各占一线宽的一般

lineCap = 'butt' | 'round'| 'square'

image.png

lineJoin = 'round' | 'beval' | 'miter'

同一个path内 线条与线条间接合的样式

image.png

虚线

setLineDash([20,5]) //[实线长度,间隙长度]

this.ctx.setLineDash([10,5])//实线长度为20 间隙为5
this.ctx.lineDashOffset = -0
this.ctx.strokeRect(50,50,200,200);
this.ctx.draw();
image.png

绘制文本

fillText(text, x, y [, maxWidth])

填充绘制指定文本最大宽度可选

strokeText(text, x, y [, maxWidth])

描边绘制指定文本 最大宽度可选

绘制图片

状态保存和回复

变形

平移

旋转

缩放

变形矩阵

合成

裁剪路径

动画

动画基本步骤

清空canvas

保存cancas状态

绘制动画图形

恢复canvas状态

控制动画

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351

推荐阅读更多精彩内容

  • 最基本的使用创建一个画布所有的操作都在画布的context上面canvas是基于状态而不是基于对象的,比如说颜色都...
    亲爱的孟良阅读 1,653评论 0 4
  • canvas制造2d环境: var txt = cvs.grtContext(‘2d’); 绘制矩形: fillR...
    WeekOne阅读 329评论 0 0
  • 参考 使用canvas来绘制图形 知识点 图形的基本元素是路径。路径是通过不同颜色和宽度的线段或曲线相连形成的不同...
    小人物的秘密花园阅读 440评论 0 0
  • 参考资料 Canvas API - Web APIs | MDN https://developer.mozil...
    谢_ffd1阅读 384评论 0 0
  • 今天在小饭桌,妈妈接我接的特别早。我好高兴啊。我和一个小区的小朋友一块儿回来的。 我们俩约好回到家以后赶紧完成作业...
    三木加油阅读 324评论 0 0