canvas 绘制矩形缺角

2018-9-29 19:49| 作者: admin| 查看: 1284| 评论: 0|来自: 蚂蚁部落

绘制矩形的方式有多种,具体参阅canvas绘制矩形简单介绍一章节。

本文介绍一下使用lineTo方法绘制矩形时出现的一个怪异现象。

那就是矩形的一角出现残缺,代码实例如下:

[HTML] 纯文本查看 复制代码运行代码
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="author" content="http://www.softwhy.com/" />
<title>蚂蚁部落</title>
<script>
window.onload=function(){
  let canvas = document.getElementById("canvas");
  let ctx = canvas.getContext("2d");
  ctx.lineWidth = 10;
  ctx.moveTo(100, 100);
  ctx.lineTo(200, 100);
  ctx.lineTo(200, 200);
  ctx.lineTo(100, 200);
  ctx.lineTo(100, 100);

  ctx.strokeStyle = 'rgba(255,0,0)';
  ctx.stroke();
}
</script>
</head>
<body>
<canvas id="canvas" width="400" height="300"></canvas>
</body>
</html>

代码运行效果截图如下:

a:3:{s:3:\"pic\";s:43:\"portal/201809/29/195027ozykk2jndqcdd5xj.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

很明显上面矩形的左上侧出现了缺角现象。

特别说明:此现象也具有浏览器兼容问题,当前(2018-9-29),在较新版本谷歌浏览器中显示一切正常,在edge或者火狐等浏览器会出现缺角,本文的主要目的是告诉读者,lineTo方式绘制矩形可能会出现此现象,并巩固绘制线条所涉及的知识,具体哪些浏览器会出现,感兴趣的可以自行测试。

一.出现缺角分析如下:

canvas lineWidth绘制原理一章节介绍了canvas绘制线条的原理。

于是通过lineTo方法绘制四条边原理上出现如下效果:

a:3:{s:3:\"pic\";s:43:\"portal/201809/29/195354tlz6ejjj9lzhutb6.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

但是为什么只有左上角看起来是比较"原生"一点,其他三个角则比较圆滑呢。

这是因为从moveTo方法规定的点开始进行绘制,从第一个点到第五个点绘制是连贯的。

但是第五个点是结束点,不能说第五个点到第一个点之间是连贯的,注意顺序。

只能说这两个点恰好重合,所以左上角就显得非常"原生"。

那么只要我们让它们之间连贯起来就好了,代码修改如下:

[HTML] 纯文本查看 复制代码运行代码
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="author" content="http://www.softwhy.com/" />
<title>蚂蚁部落</title>
<script>
window.onload=function(){
  let canvas = document.getElementById("canvas");
  let ctx = canvas.getContext("2d");
  ctx.lineWidth = 10;
  ctx.moveTo(100, 100);
  ctx.lineTo(200, 100);
  ctx.lineTo(200, 200);
  ctx.lineTo(100, 200);
  ctx.lineTo(100, 100);
  ctx.closePath();
  
  ctx.strokeStyle = 'red';
  ctx.stroke();
}
</script>
</head>
<body>
<canvas id="canvas" width="400" height="300"></canvas>
</body>
</html>

代码运行效果截图如下:

a:3:{s:3:\"pic\";s:43:\"portal/201809/29/195443oinekfvfkvp8epjn.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

解决方案非常简单使用closePath方法闭合子路径即可。

关于closePath方法的使用可以参阅canvas closePath()一章节。


鲜花

握手

雷人

路过

鸡蛋
返回顶部