Canvas入门(二)

Canvas入门(二)

如果这篇文章对你有所帮助,点个赞呗!!!

绘制路径

绘制路径需要先调用beginPath,表示要开始绘制路径,再调用以下方法来绘制路径。

  • lineTo(x, y):绘制一条从上一个点到(x, y)的直线
  • moveTo(x, y):不绘制线条,只是把画笔移动到(x, y)
  • 更多

绘制完路径后,可以指定fillStyle属性并调用fill方法来填充路径,也可以指定strokeStyle属性并调用stoke方法来描画路径。

const mycanvas = document.getElementById("mycanvas");

// 确保浏览器支持canvas
if (mycanvas.getContext) {
  const context = mycanvas.getContext("2d");

  // 创建路径
  context.beginPath();

  // 绘制圆弧,参数分别是圆心x坐标、圆形y坐标、圆弧半径、圆弧起始点(单位:弧度)、圆弧终点(单位:弧度)、绘制方向(false为顺时针绘制,true为逆时针绘制)
  context.arc(1001009902 * Math.PI, true);

  // context.fillStyle = 'pink'
  // context.fill()

  context.strokeStyle = "pink";
  context.stroke();
}
Canvas入门(二)
image-20220522111214015

还可以调用clip方法创建一个新的剪切区域。

const mycanvas = document.getElementById("mycanvas");

// 确保浏览器支持canvas
if (mycanvas.getContext) {
  const context = mycanvas.getContext("2d");

  // 创建路径
  context.beginPath();

  // 绘制圆弧,参数分别是圆心x坐标、圆形y坐标、圆弧半径、圆弧起始点(单位:弧度)、圆弧终点(单位:弧度)、绘制方向(false为顺时针绘制,true为逆时针绘制)
  context.arc(1001005002 * Math.PI, true);

  context.fillStyle = "pink";
  context.clip();

  context.fillRect(00100100);
}

上面的扇形怎么出来的呢?我们可以把clip变成fill,看下没有被剪切的话,是什么样子。

Canvas入门(二)
img

也就是说,实际上剪切就是两个图形相交部分。

如果使用lineTo需要注意:没有设置moveTo时,这个位置并不是(0, 0),而是空,所以第一次的lineTo没法画出结果。

const mycanvas = document.getElementById("mycanvas");

// 确保浏览器支持canvas
if (mycanvas.getContext) {
  const context = mycanvas.getContext("2d");
  // 创建路径
  context.beginPath();

  // context.moveTo(0, 0);
  context.lineTo(10050);
  context.lineTo(2000);

  context.lineWidth = 8;
  context.strokeStyle = "pink";

  // 描画路径
  context.stroke();
}

没有moveTo

Canvas入门(二)
image-20220522112404156

moveTo

Canvas入门(二)
image-20220522112440786

beginPath 的作用

上面的例子中,beginPath并没有作用,也就是说上面的例子中,其实有没有beginPath都一样。那么beginPath有什么作用呢?

beginPath表示下面绘制的图形是一个新的路径。具体看下实例。

const context = mycanvas.getContext("2d");
// 创建路径
context.beginPath();

context.moveTo(00);
context.lineTo(10050);

context.lineWidth = 8;
context.strokeStyle = "pink";

// 描画路径
context.stroke();

context.lineTo(2000);
context.strokeStyle = "purple";
context.stroke();
Canvas入门(二)
image-20220522112513152

想要的效果是画出两条不一样颜色的线,但是最后是一种颜色折线,这是因为我们只是用了一次beginPath,所以就会把这两条线当成同一个路径,最后调用的stroke就会把原本是粉色的线再用紫色画一遍,所以最终的效果就是只有一条折线。

所以需要使用beginPath创建新路径,新的路径还是会有没有设置moveTo时,这个位置并不是(0, 0),而是空的问题,所以需要使用moveTo设置位置

const mycanvas = document.getElementById("mycanvas");

// 确保浏览器支持canvas
if (mycanvas.getContext) {
  const context = mycanvas.getContext("2d");
  // 创建路径
  context.beginPath();

  context.moveTo(00);
  context.lineTo(10050);

  context.lineWidth = 8;
  context.strokeStyle = "pink";
  context.stroke();

  context.beginPath();
  // 创建新的路径,需要重新设置位置
  context.moveTo(10050);
  context.lineTo(2000);
  context.strokeStyle = "purple";
  context.stroke();
}
Canvas入门(二)
image-20220522112538976

closePath 的作用

有可能会陷进closePath是结束路径的误区,认为closePath就是beginPath的配套。但是closePathbeginPath并不是配套的,它们的功能不一样。所以closePath之后的路径也不是新的路径,只有beginPath才行。

closePath的作用是将最近绘制的路径闭合,和之前有没有beginPath无关

const mycanvas = document.getElementById("mycanvas");

// 确保浏览器支持canvas
if (mycanvas.getContext) {
  const context = mycanvas.getContext("2d");

  // context.beginPath();  // 有无`beginPath`都没有影响

  context.moveTo(1010);
  context.lineTo(10050);
  context.lineTo(2070);
  context.closePath();

  context.lineWidth = 8;
  context.strokeStyle = "pink";
  context.stroke();
}
Canvas入门(二)
image-20220522112629070

上面我们只绘制了两条线,但是最终得到的结果是一个三角形,这是因为我们使用closePath把最近绘制的路径闭合了。

绘制文本

绘制文本有两种方法。

  1. fillText:使用fillStyle属性绘制文本
  2. strokeText:使用strokeStyle属性绘制文本
const mycanvas = document.getElementById("mycanvas");

// 确保浏览器支持canvas
if (mycanvas.getContext) {
  const context = mycanvas.getContext("2d");

  context.moveTo(1010);
  context.lineTo(15075);
  context.lineTo(30100);
  context.closePath();

  context.lineWidth = 1;
  context.strokeStyle = "pink";

  context.fillStyle = "purple";
  context.fillText("CLZ"5060);
  context.strokeText("CLZ"5080);

  context.stroke();
}
Canvas入门(二)
image-20220522112741066

可以通过fonttextAligntextBaseline属性设置文本的字体、对齐方式、基线。

示例:

context.font = "700 16px Arial";
Canvas入门(二)
img

textAlign

  • 如果是start,那么 x 坐标就是文本的左侧坐标
  • 如果是center,那么 x 坐标就是文本的中心点坐标
  • 如果是end,那么 x 坐标就是文本的右侧坐标
const mycanvas = document.getElementById("mycanvas");

// 确保浏览器支持canvas
if (mycanvas.getContext) {
  const context = mycanvas.getContext("2d");

  context.moveTo(1010);
  context.lineTo(15075);
  context.lineTo(30100);
  context.closePath();

  context.lineWidth = 1;
  context.strokeStyle = "pink";

  context.font = "700 16px Arial";
  context.fillStyle = "purple";

  context.textAlign = "start";
  context.strokeText("CLZ"5050);

  context.textAlign = "center";
  context.fillText("CLZ"5065);

  context.textAlign = "end";
  context.strokeText("CLZ"5080);

  context.stroke();
}
Canvas入门(二)
image-20220522112924112

textBaseline类似


原文始发于微信公众号(赤蓝紫):Canvas入门(二)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/45365.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!