O'Reillyの書籍「HTML5 Canvas」の作業を開始しました。私は第2章にあります。例の1つは、よく説明されていないコードを示しています。例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();
第2に、なぜコンテキスト状態をプッシュする必要がありますか?なぜクリッピング領域を変更できないのですか?それは状態を押すことなく動作しないので必要と思われる。私が状態を押して復元しなければ、大きな青い円は現れず、なぜ私は理解しません。
beginPathは完全な新しいパスを開始し、古いパスをダンプします。 closePathはbeginPathとは関係ありません。 ClosePathは現在の位置から最後のmoveTo位置までlineToを作成します。あなたは好きなだけ多くのclosePathを持つことができます。レンダリング出力ごとに1つのbeginPathを持つことができます(stroke()、fill())。クリップは累積されており、前のクリップでクリップされたクリップを追加するたびに、各クリップ領域が小さくなります。復元するには、保存と復元を使用する必要があります。 – Blindman67