保存的方法save(),恢复的方法restore()
保存方法,是将状态保存在一个状态栈里,先进后出,后进先出。
示例demo:
<
script
>
var canvas = document . getElementById ( "canvas" );
var ctx = canvas . getContext ( "2d" );
//1 、绘制一个绿色描边的矩形
ctx . strokeStyle = "green" ;
ctx . lineWidth = 3 ;
ctx .setLineDash ([ 10 , 5 , 2 , 5 ]);
ctx . strokeRect ( 50 , 50 , 300 , 200 );
//2 、绘制一个红色描边的圆
ctx . beginPath ();
ctx . lineWidth = 5 ;
ctx . strokeStyle = "red" ;
ctx .setLineDash ([]);
ctx . arc ( 600 , 150 , 150 , 0 , 2 * Math . PI );
ctx . stroke ();
//3 、绘制一个绿色描边的圆
ctx . beginPath ();
ctx .setLineDash ([ 10 , 5 , 2 , 5 ]);
ctx . lineWidth = 3 ;
ctx . strokeStyle = "green" ;
ctx . arc ( 500 , 400 , 150 , 0 , 2 * Math . PI );
ctx . stroke ();
</ script >
var canvas = document . getElementById ( "canvas" );
var ctx = canvas . getContext ( "2d" );
//1 、绘制一个绿色描边的矩形
ctx . strokeStyle = "green" ;
ctx . lineWidth = 3 ;
ctx .setLineDash ([ 10 , 5 , 2 , 5 ]);
ctx . strokeRect ( 50 , 50 , 300 , 200 );
//2 、绘制一个红色描边的圆
ctx . beginPath ();
ctx . lineWidth = 5 ;
ctx . strokeStyle = "red" ;
ctx .setLineDash ([]);
ctx . arc ( 600 , 150 , 150 , 0 , 2 * Math . PI );
ctx . stroke ();
//3 、绘制一个绿色描边的圆
ctx . beginPath ();
ctx .setLineDash ([ 10 , 5 , 2 , 5 ]);
ctx . lineWidth = 3 ;
ctx . strokeStyle = "green" ;
ctx . arc ( 500 , 400 , 150 , 0 , 2 * Math . PI );
ctx . stroke ();
</ script >
运用保存和恢复的写法:
<
script
>
var canvas = document . getElementById ( "canvas" );
var ctx = canvas . getContext ( "2d" );
//1 、绘制一个绿色描边的矩形
ctx . strokeStyle = "green" ;
ctx . lineWidth = 3 ;
ctx .setLineDash ([ 10 , 5 , 2 , 5 ]);
ctx . strokeRect ( 50 , 50 , 300 , 200 );
ctx . save ();
//2 、绘制一个红色描边的圆
ctx . beginPath ();
ctx . lineWidth = 5 ;
ctx . strokeStyle = "red" ;
ctx .setLineDash ([]);
ctx . arc ( 600 , 150 , 150 , 0 , 2 * Math . PI );
ctx . stroke ();
//3 、绘制一个绿色描边的圆
ctx . beginPath ();
// 恢复
ctx . restore ();
ctx . arc ( 500 , 400 , 150 , 0 , 2 * Math . PI );
ctx . stroke ();
</ script >
var canvas = document . getElementById ( "canvas" );
var ctx = canvas . getContext ( "2d" );
//1 、绘制一个绿色描边的矩形
ctx . strokeStyle = "green" ;
ctx . lineWidth = 3 ;
ctx .setLineDash ([ 10 , 5 , 2 , 5 ]);
ctx . strokeRect ( 50 , 50 , 300 , 200 );
ctx . save ();
//2 、绘制一个红色描边的圆
ctx . beginPath ();
ctx . lineWidth = 5 ;
ctx . strokeStyle = "red" ;
ctx .setLineDash ([]);
ctx . arc ( 600 , 150 , 150 , 0 , 2 * Math . PI );
ctx . stroke ();
//3 、绘制一个绿色描边的圆
ctx . beginPath ();
// 恢复
ctx . restore ();
ctx . arc ( 500 , 400 , 150 , 0 , 2 * Math . PI );
ctx . stroke ();
</ script >
save保存的状态栈的原理:先进后出:
<
script
>
var canvas = document . getElementById ( "canvas" );
var ctx = canvas . getContext ( "2d" );
//1 、绘制一个绿色描边的矩形
ctx . strokeStyle = "green" ;
ctx . lineWidth = 3 ;
ctx .setLineDash ([ 10 , 5 , 2 , 5 ]);
ctx . strokeRect ( 50 , 50 , 300 , 200 );
ctx . save ();
//2 、绘制一个红色描边的圆
ctx . beginPath ();
ctx . lineWidth = 5 ;
ctx . strokeStyle = "red" ;
ctx .setLineDash ([]);
ctx . arc ( 600 , 150 , 150 , 0 , 2 * Math . PI );
ctx . stroke ();
ctx . save ();
//3 、绘制一个绿色描边的圆
ctx . beginPath ();
// 恢复
ctx . restore (); // 恢复到第二个状态
ctx . restore (); // 恢复到第一个状态
ctx . arc ( 500 , 400 , 150 , 0 , 2 * Math . PI );
ctx . stroke ();
</ script >
var canvas = document . getElementById ( "canvas" );
var ctx = canvas . getContext ( "2d" );
//1 、绘制一个绿色描边的矩形
ctx . strokeStyle = "green" ;
ctx . lineWidth = 3 ;
ctx .setLineDash ([ 10 , 5 , 2 , 5 ]);
ctx . strokeRect ( 50 , 50 , 300 , 200 );
ctx . save ();
//2 、绘制一个红色描边的圆
ctx . beginPath ();
ctx . lineWidth = 5 ;
ctx . strokeStyle = "red" ;
ctx .setLineDash ([]);
ctx . arc ( 600 , 150 , 150 , 0 , 2 * Math . PI );
ctx . stroke ();
ctx . save ();
//3 、绘制一个绿色描边的圆
ctx . beginPath ();
// 恢复
ctx . restore (); // 恢复到第二个状态
ctx . restore (); // 恢复到第一个状态
ctx . arc ( 500 , 400 , 150 , 0 , 2 * Math . PI );
ctx . stroke ();
</ script >
保存和恢复方法使用的示例
demo1
<
script
>
var canvas = document . getElementById ( "canvas" );
var ctx = canvas . getContext ( "2d" );
ctx . strokeRect ( 0 , 0 , 300 , 200 );
ctx . save ();
ctx . translate ( 200 , 200 );
ctx . strokeRect ( 0 , 0 , 300 , 200 );
ctx . restore ();
ctx . clearRect ( 0 , 0 , canvas . width , canvas . height );
</ script >
var canvas = document . getElementById ( "canvas" );
var ctx = canvas . getContext ( "2d" );
ctx . strokeRect ( 0 , 0 , 300 , 200 );
ctx . save ();
ctx . translate ( 200 , 200 );
ctx . strokeRect ( 0 , 0 , 300 , 200 );
ctx . restore ();
ctx . clearRect ( 0 , 0 , canvas . width , canvas . height );
</ script >
demo2:
<
script
>
var canvas = document . getElementById ( "canvas" );
var ctx = canvas . getContext ( "2d" );
var x= 0 ;
var timer= setInterval ( function (){
ctx . clearRect ( 0 , 0 , canvas . width , canvas . height );
ctx . save ();
ctx . translate ( x , 0 );
ctx . strokeRect ( 0 , 0 , 300 , 200 );
ctx . restore ();
x++ ;
}, 10 );
</ script >
var canvas = document . getElementById ( "canvas" );
var ctx = canvas . getContext ( "2d" );
var x= 0 ;
var timer= setInterval ( function (){
ctx . clearRect ( 0 , 0 , canvas . width , canvas . height );
ctx . save ();
ctx . translate ( x , 0 );
ctx . strokeRect ( 0 , 0 , 300 , 200 );
ctx . restore ();
x++ ;
}, 10 );
</ script >
。