canvas save()
save()方法可以儲存前面圖案的繪製狀態。
特別注意的是,save()方法儲存的是繪製狀態,而不是圖形本身。
比如我們可以儲存圖形的填充顏色、描邊顏色、位移或者縮放,這些都圖案的狀態。
通過restore()方法可以還原通過save()方法儲存的狀態。
語法結構:
[JavaScript] 純文字檢視 複製程式碼ctx.save();
每呼叫一次save()方法儲存一次canvas圖案的狀態。
記憶體中專門開闢一個狀態棧用於儲存狀態,簡單圖示如下:
圖示簡單分析如下:
(1).每呼叫一次save()方法,在棧中儲存一次狀態。
(2).存入的時間越早,狀態在棧中的位置越靠下。
(3).如果儲存的順序是0、1、2、3,那麼彈出的順序就是3、2、1、0。
瀏覽器相容:
(1).IE9+瀏覽器支援此方法。
(2).edge瀏覽器支援此方法。
(3).谷歌瀏覽器支援此方法。
(4).火狐瀏覽器支援此方法。
(5).Opera瀏覽器支援此方法。
(6).Safari瀏覽器支援此方法。
程式碼例項如下:
[HTML] 純文字檢視 複製程式碼執行程式碼<!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset=" utf-8"> <meta name="author" content="http://www.softwhy.com/" /> <title>螞蟻部落</title> <style> canvas{ border: 1px solid #000; } </style> <script> window.onload = () => { let cvs=document.querySelector('canvas'); let ctx=cvs.getContext('2d'); ctx.save(); ctx.setLineDash([5]); ctx.lineWidth=4; ctx.strokeStyle='green'; ctx.strokeRect(10,10,100,100); ctx.restore(); ctx.arc(150,150,50,0,2*Math.PI); ctx.stroke(); } </script> </head> <body> <canvas height="200"></canvas> </body> </html>
程式碼執行效果截圖如下:
程式碼分析如下:
[JavaScript] 純文字檢視 複製程式碼ctx.save();
上述可以儲存前面的狀態,前面沒有人為定義狀態,所以都是預設狀態。
[JavaScript] 純文字檢視 複製程式碼ctx.setLineDash([5]); ctx.lineWidth=4; ctx.strokeStyle='green'; ctx.strokeRect(10,10,100,100);
上述程式碼繪製一個虛線、邊框寬度為4和邊框顏色為綠色的矩形。
但是後面並沒有呼叫save()方法,所以這些狀態並沒有被儲存起來。
[JavaScript] 純文字檢視 複製程式碼ctx.restore(); ctx.arc(150,150,50,0,2*Math.PI); ctx.stroke();
前面程式碼呼叫restore()方法,可以從改狀態棧中彈出儲存的狀態。
下面繪製一個圓形,那麼這個圓形會應用這個彈出恢復的狀態。
前面儲存的狀態是預設的,所以圓形的描邊是黑色,而不是前面規定的綠色描邊。
[HTML] 純文字檢視 複製程式碼執行程式碼<!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset=" utf-8"> <meta name="author" content="http://www.softwhy.com/" /> <title>螞蟻部落</title> <style> canvas{ border: 1px solid black; } </style> <script> window.onload = () => { let cvs=document.querySelector('canvas'); let ctx=cvs.getContext('2d'); //儲存狀態一 ctx.save(); ctx.lineWidth=2; ctx.strokeStyle='green'; ctx.strokeRect(10,10,100,100); //儲存狀態二 ctx.save(); ctx.lineWidth=8; ctx.strokeStyle='blue'; ctx.strokeRect(50,50,100,100); //儲存狀態三 ctx.save(); //彈出還原狀態三 ctx.restore(); ctx.strokeRect(200,200,100,100); //彈出還原狀態二 ctx.restore(); ctx.strokeRect(250,250,100,100); //彈出還原狀態一 ctx.restore(); ctx.strokeRect(300,300,100,100); } </script> </head> <body> <canvas width="800" height="600"></canvas> </body> </html>
程式碼執行效果截圖如下:
上面程式碼多次使用save()方法儲存狀態,然後再使用restore()方法彈出還原狀態。
首先儲存的狀態會被最後彈出,遵循棧記憶體先進後出的規則。
(1).第一個儲存的是預設黑色描邊,描邊的寬度是1px。
(2).第二個儲存的是綠色描邊,描邊的寬度是2px。
(3).第三個儲存的是藍色描邊,描邊的寬度是8px。
(4).當使用restore()方法彈出還原的時候,順序是三、二、一,恰好和儲存順序相反。
相關文章
- canvas save()和restore()CanvasREST
- Android 高階UI9 Canvas save和restore例項解析AndroidUICanvasREST
- npm install -save 和 -save-devNPMdev
- npm –save-dev –save 的區別NPMdev
- vue 前端實現pdf下載.npm install html2canvas jspdf --saveVue前端NPMHTMLCanvasJS
- save() create()區別
- save download pdf
- Unable to save settings: Failed to save settings. Please restart PyCharm解決AIRESTPyCharm
- docker tag save loadDocker
- F. Magic Will Save the World
- Laravel Lego :Save you from CRUDLaravelGo
- Save and Edit a Report Specification locally
- Unable to save settings: Failed to save settings. Please restart IntelliJ IDEA 解決方案AIRESTIntelliJIdea
- FMDB使用SQLite事務Save PointSQLite
- iptables-save中文手冊(轉)
- Idea報錯“Unable to save settings: Failed to save settings. Please restart IntelliJ IDEA”IdeaAIRESTIntelliJ
- Linux基礎命令---iptables-saveLinux
- 儲存載入模型model.save()模型
- Entity Framework 6.0 Tutorials(2):Async query and SaveFramework
- Django模型中的save方法 精講Django模型
- redis : Can't save in background: fork: Cannot allocate memoryRedis
- 模型的 save() 方法無法使用佇列?模型佇列
- wordpress的save_post鉤子注意點
- Spark SQL:通用的load和save操作SparkSQL
- git stash save與git stash push區別Git
- percona save/restore buffer pool特性記錄REST
- Spring Data MongoDB cascade save on DBRef objectsSpringMongoDBObject
- “How to Save Report To Excel” 技術改進Excel
- WPF Image add watermark and save marked image as jpg
- Docker(十三)-Docker save and load映象儲存Docker
- canvasCanvas
- redis.conf之save配置項解讀Redis
- 【Lintcode】1601. Boats to Save People
- WIFI power save 模式下的資料收發WiFi模式
- save the status of schema and gather all stat of schemas again.AI
- canvas clearRect()Canvas
- canvas toBlob()Canvas
- canvas toDataURL()Canvas