存储和恢复 HTML5 Canvas 状态

fmms 13年前
     <p>当我们在 HTML5 Canvas 上使用其 2D 上下文进行图形绘制的时候,可以通过操作 2D 上下文的属性来绘制不同风格的图形,例如不同字体、填充等等。</p>    <p>通常情况下,在画布上的绘图时,您需要更改在绘制的2D背景下的状态。例如,你可能需要一个strokStyle 一行或矩形,另有其他行或矩形strokeStyle。或不同的旋转,或别的东西。</p>    <p>设置绘图的属性非常繁琐,每次更改时都要从来一次,本文将介绍如何利用堆栈来保持绘图的属性并在需要的时候随时恢复。例如我们可以通过下面两个方法来实现保存绘图属性和获取属性:</p>    <pre class="brush:js; toolbar: true; auto-links: false;">context.save();     // state pushed onto stack.  context.restore();  // state popped from stack, and set on 2D Context.</pre>    <p>你可以保持多个绘图属性到堆栈中,并在需要的时候从堆栈中弹出:</p>    <pre class="brush:js; toolbar: true; auto-links: false;">var canvas  = document.getElementById("ex1"); var context = canvas.getContext("2d");  context.fillStyle  ="#66ff66"; context.strokeStyle="#990000"; context.lineWidth  = 5;  context.fillRect  (5, 5, 50, 50); context.strokeRect(5, 5, 50, 50);  context.save();  context.fillStyle = "#6666ff";  context.fillRect  (65, 5, 50, 50); context.strokeRect(65, 5, 50, 50);  context.save();  context.strokeStyle = "#000099";  context.fillRect  (125, 5, 50, 50); context.strokeRect(125, 5, 50, 50);  context.restore();  context.fillRect  (185, 5, 50, 50); context.strokeRect(185, 5, 50, 50);  context.restore();  context.fillRect  (245, 5, 50, 50); context.strokeRect(245, 5, 50, 50);</pre>    <p></p>    <p>下图是采用以上代码的绘制结果:</p>    <p><img alt="" src="https://simg.open-open.com/show/21722efcc423e71eb8acfa24bf758da5.png" width="300" height="59" /></p>    <p>如果你频繁的做各种复杂的绘图设置时,状态堆栈是相当有用的。</p>    <p>所有的 2D 绘图上下文属性都是可保存和恢复的属性,但绘制的内容可不是,也就是说你恢复了绘图上下文,并不会恢复其所绘制的图形。</p>    <p>2D 绘图上下文包括如下设置:</p>    <ul>     <li>fillStyle</li>     <li>font</li>     <li>globalAlpha</li>     <li>globalCompositionOperation</li>     <li>lineCap</li>     <li>lineJoin</li>     <li>lineWidth</li>     <li>miterLimit</li>     <li>shadowBlur</li>     <li>shadowColor</li>     <li>shadowOffsetX</li>     <li>shadowOffsetY</li>     <li>strokeStyle</li>     <li>strokeStyle</li>     <li>textAlign</li>     <li>textBaseline</li>     <li>The clipping region</li>     <li>The transformation matrix (rotations + translations via context.rotate() + context.setTransform())</li>    </ul>    <p>这个列表并不完整,还不包含一些标准的属性。</p>    <p><em>Source: <a href="/misc/goto?guid=4959500775943422609" rel="nofollow">http://tutorials.jenkov.com/html5-canvas/state.html</a></em> </p>