canvas clip()

2018-8-9 09:08| 作者: admin| 查看: 1558| 评论: 0|来自: 蚂蚁部落

clip翻译成英文是切割的意思,的确名副其实,此方法具有切割功能。

它可以依照前面创建的路径进行一次切割,然后所有在clip之后绘制的图形只有在被切割的路径内才会显示,路径外的则不得显示。

看一个代码实例:

[HTML] 纯文本查看 复制代码运行代码
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="author" content="http://www.softwhy.com/" />
<title>蚂蚁部落</title>
<style>
canvas {
  border: 2px dotted #ccc;
}
</style>
<script type="text/javascript">
window.onload = function () {
  var canvas = document.getElementById('canvas');
  var ctx = canvas.getContext('2d');
  ctx.beginPath();
  ctx.arc(100, 100, 50, 0, Math.PI * 2);
  ctx.clip();
  ctx.beginPath();
  ctx.rect(100, 100, 100, 100);
  ctx.fill();
}
</script>
</head>
<body>
<canvas id="canvas" width="350" height="250"></canvas>
</body>
</html>

上面的代码中,首先通过arc方法绘制一个路径,然后用clip方法进行切割。

后面绘制的图形只会在这个切割的路径内显示。

就如同将一个遮罩覆盖在墙上,然后在这个遮罩上抠掉一部分区域,如果想要在墙上绘制图案,只能够在这个抠除的部分进行操作。clip之后,这个遮罩切除效果一直都会存在,无论后面有多少路径。

代码实例如下:

[HTML] 纯文本查看 复制代码运行代码
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="author" content="http://www.softwhy.com/" />
<title>蚂蚁部落</title>
<style>
canvas {
  border: 2px dotted #ccc;
}
</style>
<script type="text/javascript">
window.onload = function () {
  var canvas = document.getElementById('canvas');
  var ctx = canvas.getContext('2d');
  ctx.beginPath();
  ctx.arc(100, 100, 50, 0, Math.PI * 2);
  ctx.clip();
  ctx.beginPath();
  ctx.rect(100, 100, 100, 100);
  ctx.fill();
  ctx.beginPath();
  ctx.fillStyle = "#F00";
  ctx.arc(100, 100, 100, 0, Math.PI * 2);
  ctx.fill();
}
</script>
</head>
<body>
<canvas id="canvas" width="350" height="250"></canvas>
</body>
</html>

后面尽管有多个路径,但是绘图区域依然被限制在切割之前的路径之内。

二.解除clip切割的限制:

使用save和restore方法可以解除clip()切割的显示。

关于上述两个方法具体用法可以参阅canvas save()和restore()方法一章节。

代码实例如下:

[HTML] 纯文本查看 复制代码运行代码
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="author" content="http://www.softwhy.com/" />
<title>蚂蚁部落</title>
<style>
canvas {
  border: 2px dotted #ccc;
}
</style>
<script type="text/javascript">
window.onload = function () {
  var canvas = document.getElementById('canvas');
  var ctx = canvas.getContext('2d');
  ctx.beginPath();
  ctx.save();
  ctx.arc(100, 100, 50, 0, Math.PI * 2);
  ctx.clip();
  ctx.beginPath();
  ctx.rect(100, 100, 100, 100);
  ctx.fill();
  ctx.restore();
  ctx.beginPath();
  ctx.fillStyle = "#F00";
  ctx.arc(100, 100, 100, 0, Math.PI * 2);
  ctx.fill();
}
</script>
</head>
<body>
<canvas id="canvas" width="350" height="250"></canvas>
</body>
</html>

再来看一段代码实例:

[HTML] 纯文本查看 复制代码运行代码
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="author" content="http://www.softwhy.com/" />
<title>蚂蚁部落</title>
<style>
canvas {
  border: 2px dotted #ccc;
}
</style>
<script type="text/javascript">
window.onload = function () {
  var canvas = document.getElementById('canvas');
  var ctx = canvas.getContext('2d');
  ctx.arc(100, 100, 50, 0, Math.PI * 2);
  ctx.beginPath();
  ctx.clip();
  ctx.beginPath();
  ctx.rect(100, 100, 100, 100);
  ctx.fill();
  ctx.beginPath();
  ctx.fillStyle = "#F00";
  ctx.arc(100, 100, 100, 0, Math.PI * 2);
  ctx.fill();
}
</script>
</head>
<body>
<canvas id="canvas" width="350" height="250"></canvas>
</body>
</html>

上面的代码不能够绘制任何图案,这是因为clip()方法前面最近的beginPath()方法后面没有绘制任何路径,所以clip()方法也就不能够切割任何路径,也就是么能在墙的遮罩上抠除任何区域,当然无法再墙面上绘图了。


鲜花

握手

雷人

路过

鸡蛋
返回顶部