canvas
一、绘制 canvas 只支持两种形式的图形绘制:矩形和路径
-
三种方法绘制矩形: fillRect(x, y, width, height) 绘制一个填充的矩形 strokeRect(x, y, width, height) 绘制一个矩形的边框 clearRect(x, y, width, height)
-
绘制路径: moveTo 设置起点,可以绘制不连续的路径 beginPath() 新建一条路径,生成之后,图形绘制命令被指向到路径上生成路径。 closePath() 闭合路径之后图形绘制命令又重新指向到上下文中。 stroke() 通过线条来绘制图形轮廓。 fill()
当你调用 fill() 函数时,所有没有闭合的形状都会自动闭合, 所以你不需要调用 closePath() 函数。但是调用 stroke() 时不会自动闭合。
// 填充三角形 ctx.beginPath(); ctx.moveTo(25, 25); ctx.lineTo(105, 25); ctx.lineTo(25, 105); ctx.fill();
// 描边三角形 ctx.beginPath(); ctx.moveTo(125, 125); ctx.lineTo(125, 45); ctx.lineTo(45, 125); ctx.closePath(); ctx.stroke();
- 圆弧 arc(x, y, radius, startAngle, endAngle, anticlockwise) arcTo(x1, y1, x2, y2, radius)
A. arc(x, y, radius, startAngle, endAngle, anticlockwise) 参数anticlockwise为一个布尔值。为 true 时,是逆时针方向,否则顺时针方向。
备注: arc() 函数中表示角的单位是弧度,不是角度。角度与弧度的 js 表达式: 弧度=(Math.PI/180)*角度。
Math.PI可以理解为180度,半圆。如果要60度弧度,就Math.PI / 3
笑脸例子: ctx.beginPath(); ctx.arc(75, 75, 50, 0, Math.PI * 2, true); // 绘制 ctx.moveTo(110, 75); ctx.arc(75, 75, 35, 0, Math.PI, false); // 口 (顺时针) ctx.moveTo(65, 65); ctx.arc(60, 65, 5, 0, Math.PI * 2, true); // 左眼 ctx.moveTo(95, 65); ctx.arc(90, 65, 5, 0, Math.PI * 2, true); // 右眼 ctx.stroke();
B. arcTo(x1, y1, x2, y2, radius) 先起点和终点画直线再,再画弧线
C. 二次贝赛尔曲线,三次贝赛尔曲线
控制点2个,3个更圆润
cxt.lineCap = 'round' // 默认: butt; 圆形: round; 方形: square
二、样式和颜色
- fillStyle 和 strokeStyle
// 这些 fillStyle 的值均为 '橙色' ctx.fillStyle = "orange"; ctx.fillStyle = "#FFA500"; ctx.fillStyle = "rgb(255,165,0)"; ctx.fillStyle = "rgba(255,165,0,1)";
-
globalAlpha 全局透明度 // 设置透明度值 ctx.globalAlpha = 0.2;
-
rgba() 可以分别设置轮廓和填充样式
-
线型 Line styles
-
使用虚线
-
渐变 Gradients 线性渐变: createLinearGradient(x1, y1, x2, y2) createLinearGradient 方法接受 4 个参数,表示渐变的起点 (x1,y1) 与终点 (x2,y2)。 可以配合动画帧,做效果,requestAnimationFrame(
由于定时器的时间只是我们自己设置的一个期望渲染时间,但这个时间点其实并非浏览器一个重绘的时间点,当这两个时间点出现偏差时,可能就会发生丢帧之类的现象。
requestAnimationFrame提供了更加平缓并且更加有效率的方式来执行动画,当系统准备好了重绘条件时才会调用我们动画帧的绘制方法。
径向渐变 createRadialGradient, (经典的径向渐变是只有一个中心点,简单地由中心点向外围的圆形扩张) 可以做3d 圆形效果等
- 图案样式 Patterns
ctx.createPattern(img,'repeat'); 循环来实现图案 repeat,repeat-x,repeat-y 和 no-repeat。
三、绘制图像和视频
- 获得一个指向HTMLImageElement的对象或者另一个 canvas 元素的引用作为源,也可以通过提供一个 URL 的方式来使用图片
- 使用drawImage()函数将图片绘制到画布上
- 渲染图片的方式有2中,一种是在JS里加载图片再渲染,另一种是把DOM里的图片拿到 canvas 里渲染。drawImage(image, dx, dy)
- 如果需要指定图片宽高,可以在前面的基础上再添加两个参数:drawImage(image, dx, dy, dw, dh)
- 截图图片同样使用drawImage() 方法,只不过传入的参数数量比之前都多,而且顺序也有点不一样了。drawImage(image, sx, sy, sw, sh, dx, dy, dw, dh)
- 可以绘制动态视频然后添加水印
四、绘制文本
- fillText(text, x, y [, maxWidth]) 在指定的 (x,y) 位置填充指定的文本,绘制的最大宽度是可选的。 strokeText(text, x, y [, maxWidth]) 在指定的 (x,y) 位置绘制文本边框,绘制的最大宽度是可选的。
- measureText().width 方法可以获取文本的长度,单位是 px
五、几何变形 translate 位移 translate(x, y) *x *是左右偏移量,y 是上下偏移量 rotate旋转 rotate(angle) scale缩放。scale(x, y) 如果比 1 小,会缩小图形,如果比 1 大会放大图形 transfrom
六、合成 globalCompositeOperation 可以实现刮刮卡
七、裁剪 clip()
八、像素操作 createImageData() getImageData() putImageData() 可以实现图片灰度和反相颜色
保存图片 canvas.toDataURL('image/png') 你也可以从画布中创建一个Blob对像。 canvas.toBlob(callback, type, encoderOptions)
九、pixi.js
Application, Assets, Sprite , 应用,纹理,精灵,容器,舞台 可以添加滤镜效果pix-filters
Pixi.js是一个非常快的 2D sprite 渲染引擎,支持webgl。可以帮助我们显示、动画和管理交互式图形,这样我们就可以轻松地使用JavaScript和其他HTML5技术制作游戏和应用程序。
Canvas 和 SVG 的区别
Canvas SVG 用JS动态生成元素(一个HTML元素) 用XML描述元素(类似HTML元素那样,可用多个元素来描述一个图形) 位图(受屏幕分辨率影响) 矢量图(不受屏幕分辨率影响) 不支持事件 支持事件 数据发生变化需要重绘 不需要重绘 就上面的描述而言可能有点难懂,你可以打开 AntV 旗下的图形编辑引擎做对比。 G6 是使用 canvas 开发的,X6 是使用 svg 开发的。
我的建议是:如果要展示的数据量比较大,比如一条数据就是一个元素节点,那使用 canvas 会比较合适;如果用户操作的交互比较多,而且对清晰度有要求(矢量图),那么使用 svg 会比较合适。
作者:德育处主任 链接:juejin.cn/post/711678… 来源:稀土掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。