canvas的save與restore方法的作用


網上搜羅了一堆資料,最后總結一下。

save:用來保存Canvas的狀態。save之后,可以調用Canvas的平移、放縮、旋轉、錯切、裁剪等操作。 restore:用來恢復Canvas之前保存的狀態。防止save后對Canvas執行的操作對后續的繪制有影響。

對canvas中特定元素的旋轉平移等操作實際上是對整個畫布進行了操作,所以如果不對canvas進行save以及restore,那么每一次繪圖都會在上一次的基礎上進行操作,最后導致錯位。比如說你相對於起始點每次30度遞增旋轉,30,60,90.如果不使用save 以及 restore 就會變成30, 90, 150,每一次在前一次基礎上進行了旋轉。save是入棧,restore是出棧。

 

[html]  view plain  copy
 
 print?在CODE上查看代碼片派生到我的代碼片
  1. var canvas = document.getElementById("canvas");  
  2. var context = canvas.getContext('2d');  
  3. context.lineWidth = "10";  
  4. context.strokeStyle = "#fe9901";  
  5. context.translate(canvas.width / 2, canvas.height / 2);  
  6. context.rotate( 30 / 180 * Math.PI);  
  7. context.beginPath();  
  8. context.moveTo(0, -180);  
  9. context.lineTo(0, -200);  
  10. context.stroke();  
  11.   
  12. context.rotate( 30 / 180 * Math.PI);  
  13. context.beginPath();  
  14. context.moveTo(0, -140);  
  15. context.lineTo(0, -160);  
  16. context.stroke();  

 


沒有使用save,restore,第一次繪制時畫布旋轉30度,然后按照坐標繪制直線,第二次繪制在第一次基礎上繼續繪制,旋轉30度,實際上相對於起點,旋轉了60. 所以畫出來兩條直線不在一條指線上。

 

 

[javascript]  view plain  copy
 
 print?在CODE上查看代碼片派生到我的代碼片
  1. context.save();  
  2. context.rotate( 30 / 180 * Math.PI);  
  3. context.beginPath();  
  4. context.moveTo(0, -180);  
  5. context.lineTo(0, -200);  
  6. context.stroke();  
  7. context.restore();  
  8.   
  9. context.rotate( 30 / 180 * Math.PI);  
  10. context.beginPath();  
  11. context.moveTo(0, -140);  
  12. context.lineTo(0, -160);  
  13. context.stroke();  

第二次繪制加入save和restore, 再第一次繪制后,resore到起始狀態,也就是現在畫布又回到了0度位置,而不是30度,所以第二次繪制是從0度開始繪制,繪制出來應該和第一次的直線在一條指線上。

 

 

 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM