Canvas入门

2020-01-29  本文已影响0人  David_Rao

什么是Canvas?

Canvas是H5新增的一个标签,我们可以通过js在这个标签上绘制各种图案
Canvas拥有多种绘制路径、矩形、圆形、字符以及图片的方法

Canvas画图步骤

  1. 创建一个canvas标签
    默认宽度300px,默认高度150px
<canvas></canvas>
  1. 通过js代码拿到canvas标签
let oCanvas = document.querySelector("canvas");
  1. 从canvas标签中获取到绘图工具
let oCtx = oCanvas.getContext("2d");
  1. 通过绘图工具在canvas标签上绘制图形
    以绘制直线为例
// 4.1 设置路径的起点
oCtx.moveTo(50, 50);  // (x, y)
// 4.2 设置路径的终点
oCtx.lineTo(200, 50);  // (x, y)
// 4.3 告诉canvas将这些点连接起来
oCtx.stroke();

修改canvas标签宽高

// 拉伸,会影响到内容大小
canvas{
    width: 500px;
    height: 500px;
}
// 通过行内属性修改,内容不会被拉伸
<canvas width="500" height="500"></canvas>

线条默认宽度和颜色

解决方法:

// 4.1 设置路径的起点
oCtx.moveTo(50, 50.5);  // (x, y)
// 4.2 设置路径的终点
oCtx.lineTo(200, 50.5);  // (x, y)
// 4.3 告诉canvas将这些点连接起来
oCtx.stroke();

canvas线条属性

let oCanvas = document.querySelector("canvas");
let oCtx = oCanvas.getContext("2d");
// 修改线条的高度
oCtx.lineWidth = 20;
// 修改线条的颜色
oCtx.strokeStyle = "blue";
// 修改线条两端样式,butt默认、round、square
oCtx.lineCap = "round";  
// 修改线条样式([虚线每一段的宽度, 每段虚线间的间隙])

oCtx.moveTo(50, 50);
oCtx.lineTo(200, 50);
oCtx.stroke();

canvas绘制多条直线

let oCanvas = document.querySelector("canvas");
let oCtx = oCanvas.getContext("2d");

oCtx.moveTo(50, 50);
oCtx.lineTo(200, 50);
// 在画之前可以修改样式
oCtx.lineWidth = 20;
oCtx.strokeStyle = "blue";
oCtx.lineCap = "round";  
oCtx.stroke();

// 重新开始路径
oCtx.beginPath();  
oCtx.moveTo(50, 100);
oCtx.lineTo(200, 100);
// 在画之前重新设置样式
oCtx.lineWidth = 20;
oCtx.strokeStyle = "blue";
oCtx.lineCap = "round";  
oCtx.stroke();

canvas绘制三角形

let oCanvas = document.querySelector("canvas");
let oCtx = oCanvas.getContext("2d");

oCtx.beginPath();  
// 绘制三个点
oCtx.moveTo(50, 50);
oCtx.lineTo(200, 50);
oCtx.lineTo(200, 200);
// 注意点,需要手动回到起点
oCtx.lineTo(50, 50);  

// 加宽后发现,lineTo会出现转角缺失现象
oCtx.lineWidth = 20;
oCtx.stroke();

使用closePath()解决上述问题

let oCanvas = document.querySelector("canvas");
let oCtx = oCanvas.getContext("2d");

oCtx.beginPath();  
oCtx.moveTo(50, 50);
oCtx.lineTo(200, 50);
oCtx.lineTo(200, 200);
oCtx.closePath();

oCtx.lineWidth = 20;
// 设置转角样式,miter默认、round、bovel
oCtx.lineJoin = "bovel";
oCtx.stroke();

填充图形

oCtx.beginPath();  
oCtx.moveTo(50, 50);
oCtx.lineTo(200, 50);
oCtx.lineTo(200, 200);
oCtx.closePath();

oCtx.fillStyle = "blue";  // 填充颜色
oCtx.fill();  // 填充图形

若要在图形与另一图形之间填充颜色,需要注意连接点是顺时针还是逆时针

  1. 内外矩形均是顺时针

  1. 外矩形顺时针,内矩形逆时针

  1. 非零环绕规则
oCtx.beginPath();  
oCtx.moveTo(100, 100);
oCtx.lineTo(300, 100);
oCtx.lineTo(300, 300);
oCtx.lineTo(100, 300);
oCtx.closePath();

oCtx.moveTo(250, 150);
oCtx.lineTo(150, 150);
oCtx.lineTo(150, 250);
oCtx.lineTo(250, 250);
oCtx.closePath();

oCtx.fill();  // 填充图形

绘制虚线

// 修改线条样式
// ([虚线每一段的宽度, 每段虚线间的间隙])
// 三个参数的自己试一下([])
oCtx.setLineDash([5, 20]);
 // 获得虚线的格式
console.log(oCtx.getLineDash()); 
// 设置虚线偏移位
oCtx.lineDashOffset = -50;

oCtx.moveTo(50, 50);
oCtx.lineTo(200, 50);
oCtx.stroke();

绘图工具方法及属性总结

beginPath()  // 路径重新开始,清除前面一切样式
moveTo(x, y)  // 起点
lineTo(x, y)  // 绘制点
closePath()  // 闭合路径,终点自动连接起点

lineWidth  // 线条宽度
strokeStyle  // 线条颜色
lineCap  // 线条两端样式
lineJoin  // 线条连接处拐角样式
fillStyle // 填充颜色

// 设置线条样式
setLineDash([虚线每一段的宽度, 每段虚线间的间隙])  
getLineDash()  // 获得虚线的格式
lineDashOffset  // 设置虚线偏移位

stroke(); // 绘制线条
fill();  //填充,注意非零环绕规则
上一篇 下一篇

猜你喜欢

热点阅读