天天看點

canvas save()和canvas restore()狀态的儲存和恢複使用方法及執行個體

新的一天又來啦,最近這些天一直是陰雨連綿的,也是醉了,不過還好今天終于可以看到燦爛的陽光了,現在這種溫度,最喜歡站在太陽下曬着太陽,身上暖暖的,心情也會好很好,o( ̄︶ ̄)o

canvas save()和canvas restore()狀态的儲存和恢複使用方法及執行個體

好啦,不扯這些閑篇了,進入正題吧,今天分享下

canvas.save()和canvas.restore()狀态的儲存和恢複使用方法及執行個體

canvas.save()用來儲存先前狀态的

canvas.restore()用來恢複之前儲存的狀态

注:兩種方法必須搭配使用,否則沒有效果

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>
        canvas{
            border: px solid #000;
        }
    </style>
</head>
<body>
    <canvas width="800" height="600"></canvas>
    <script>
        var canvas=document.querySelector('canvas');
        var ctx=canvas.getContext('2d');
        ctx.save();//狀态的儲存
        ctx.setLineDash([]);
        ctx.lineWidth=;
        ctx.strokeStyle='red';
        ctx.strokeRect(,,,);

        ctx.restore();//狀态的恢複
        ctx.arc(,,,,*Math.PI);
        ctx.stroke();
    </script>
</body>
</html>
           

代碼效果如下:

canvas save()和canvas restore()狀态的儲存和恢複使用方法及執行個體

大家可以看到,在最上面的時候在canvas中畫了一個矩形,而且是虛線矩形,紅色,線寬為5,後來又畫了一個圓形

注意并沒有開辟新路徑,這個圓保持了canvas預設的狀态,黑色實線1px線寬,這是為什麼呢?

就是因為在定義了ctx以後,我們用了save()儲存了初始的狀态,在我們劃圓的時候用restore恢複了初始的狀态,是以為黑色實線。

再看下面這個例子上面的代碼簡單做了改變,但是效果卻不一樣了

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>
        canvas{
            border: px solid #000;
        }
    </style>
</head>
<body>
    <canvas width="800" height="500"></canvas>
    <script>
        var canvas=document.querySelector('canvas');
        var ctx=canvas.getContext('2d');
        ctx.setLineDash([]);
        ctx.lineWidth=;
        ctx.save();//狀态的儲存,-----改變了儲存的位置
        ctx.strokeStyle='red';
        ctx.strokeRect(,,,);

        ctx.restore();//狀态的恢複
        ctx.arc(,,,,*Math.PI);
        ctx.stroke();
    </script>
</body>
</html>
           

代碼效果如下:

canvas save()和canvas restore()狀态的儲存和恢複使用方法及執行個體

這次發生了什麼變化?

圓圈變成了虛線,并且線寬也是4了,但是顔色沒有變,為啥子嘞?就是因為使用canvas中save()方法時,先執行的虛線和線寬的代碼,也就是在儲存的時候已經把虛線和線寬儲存了,是以後來在執行恢複的時候就會恢複上

不過還有一個問題是,如果進行多次儲存并且多次恢複的時候,那他又是什麼樣子的呢?先看看代碼

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>
        canvas{
            border: px solid #000;
        }
    </style>
</head>
<body>
    <canvas width="800" height="600"></canvas>
    <script>
        var canvas=document.querySelector('canvas');
        var ctx=canvas.getContext('2d');

        ctx.save();//第一次儲存

        ctx.setLineDash([]);
        ctx.lineWidth=;
        ctx.strokeStyle='red';
        ctx.strokeRect(,,,);

        ctx.save();//第二次儲存
        ctx.setLineDash([,,]);
        ctx.lineWidth=;
        ctx.strokeStyle='blue';
        ctx.strokeRect(,,,);

        ctx.save();//第三次儲存

        ctx.restore();//恢複第一次
        ctx.strokeRect(,,,);
        ctx.restore();//恢複第二次
        ctx.strokeRect(,,,);
        ctx.restore();//恢複第一次
        ctx.strokeRect(,,,);
    </script>
</body>
</html>
           

代碼運作效果如下:

canvas save()和canvas restore()狀态的儲存和恢複使用方法及執行個體

so?看到這個效果的時候是腫麼想的?這是神他喵的恢複功能?每個都不同,哈哈

接下來給大家說一個概念,就是記憶體中棧的概念–棧存儲的規律:先儲存的,後恢複,後儲存的,先恢複,ok,這個save和restore就是這樣的原理給大家畫一個圖,友善了解下

canvas save()和canvas restore()狀态的儲存和恢複使用方法及執行個體

圖上面中3第一個存儲到到棧中,2是第二個存儲到裡面的,1是最後一個存儲上的,但是想要取出是就會先取出1,在取出2,在取出3,這也就解釋了棧的規律,先儲存的後恢複,後儲存的先恢複。

這個規律如果了解的話,那麼上面canvas中用save()多次存儲和多次恢複的順序就好了解了。

ok,現在就來說下那個是怎麼恢複的

第一個儲存的時候是canvas初始的狀态,沒有進行任何操作的

第二個儲存的時候為虛線,線寬為4,線的顔色為紅色

第三次儲存的時候虛線[10,5,15],線寬為8,線的顔色為藍色

第一次恢複的就是第三次儲存的,即虛線[10,5,15],線寬為8,線的顔色為藍色

第二次恢複的就是第二次儲存的,即虛線,線寬為4,線的顔色為紅色

第三次恢複的就是canvas初始的狀态,預設線寬1px,黑色;

好啦,今天就寫到這裡吧,休息休息…..一休哥,拜拜喽!

繼續閱讀