我已经开始通过O'Reilly书“HTML5帆布”工作。我在第二章,其中一个例子提供了一些没有很好解释的代码。实施例2-5:帆布剪辑区域和帆布堆栈
- 画出一个黑箱
- 推状态
- 设置在顶小剪辑区域左
- 拉伸圆
- 弹出状态
- 设定得较大剪切区域
- 画另一个圆圈
但我无法理解一些事情:
context.fillStyle = 'black';
context.fillRect(10, 10, 200, 200);
context.save();
context.beginPath();
context.rect(0, 0, 50, 50);
context.clip();
context.beginPath();
context.strokeStyle = 'red';
context.lineWidth = 5;
context.arc(100, 100, 100, 0, 2*Math.PI, false);
context.stroke();
context.closePath();
context.restore();
context.beginPath();
context.rect(0, 0, 500, 500);
context.clip();
context.beginPath();
context.strokeStyle = 'blue';
context.lineWidth = 5;
context.arc(100, 100, 50, 0, 2*Math.PI, false);
context.stroke();
context.closePath();
我的问题:
首先,不context.clip()隐含关闭上下文路径( “context.closePath()”)?它前面有一个context.beginPath(),后面跟着另一个context.beginPath()。像这样:
context.beginPath();
context.rect(0, 0, 50, 50);
context.clip();
context.beginPath();
其次,为什么需要推送上下文状态?为什么我不能修改剪辑区域?这似乎是必要的,因为它没有推动国家就无法运作。如果我不推动状态然后恢复它,那么蓝色的大圈就不会出现,我不明白为什么。
beginPath开始一个全新的路径并转储旧的路径。 closePath与beginPath无关。 ClosePath只需创建一个从当前位置到最后一个moveTo位置的lineTo您可以根据需要设置尽可能多的closePath,每个渲染输出(stroke(),fill())只能有一个beginPath。剪辑是累积性的,每次添加一个剪辑时,剪辑会被上一个剪辑剪辑,每个剪辑区域变得越来越小。要恢复您必须使用保存和恢复。 – Blindman67