Canvas的save和restore方法简单理解

android的Canvas就是画布,用各种draw方法绘制时始终采用是画布的坐标。

默认情况下,屏幕和画布的坐标一致,都是横向x,纵向y,左上角是起点坐标(0,0)。

 

下面代码将在屏幕顶部居中的位置绘制一个半径为20的圆。

 

 

canvas.drawCircle(width/2, 20, 20, paint);

 

 

 

但是canvas类也提供了一些操作画布的方法:rotate(旋转),translate(平移),scale(缩放),调用了这些方法之后,画布的坐标就和屏幕坐标不一致了:

 

 

canvas.rotate(90,width/2,height/2);
canvas.drawCircle(width/2, 20, 20, paint);

  

 

 

这个时候因为画布的坐标系统旋转了90度,但是屏幕坐标是不变的,所以绘制的圆在屏幕右边居中。

 

 

下面介绍一下save和restore方法

 

save和restore方法必须是配对使用的,restore方法前必须有save方法,不然会报Underflow in restore错误。但是也可以只有save方法,不过只有save方法我觉得其实是无意义的。

 

save方法用于临时保存画布坐标系统的状态

restore方法可以用来恢复save之后设置的状态,

 

可以简单理解为调用restore之后,restore方法前调用的rotate/translate/scale方法全部就还原了,画布的坐标系统恢复到save方法之前,但是这里要注意的是,restore方法的调用只影响restore之后绘制的内容,对restore之前已经绘制到屏幕上的图形不会产生任何影响。

 

下面用简单例子说明一下

 

在屏幕顶部居中和右上角各绘制一个圆

 

 

Paint paint = new Paint();
paint.setStrokeWidth(20);
paint.setColor(Color.BLUE);
 
//顶部居中绘制一个圆
canvas.drawCircle(px/2, 20, 20, paint);
//右上角绘制一个圆
paint.setColor(Color.RED);
canvas.drawCircle(px-20, 20, 20, paint);

 

 

 

 

如果在中间加入save和restore方法

 

 

Paint paint = new Paint();
paint.setStrokeWidth(20);
paint.setColor(Color.BLUE);

canvas.save();//保存画布状态,后续绘制的都是在新画布坐标
canvas.rotate(90, px/2, py/2);//画布以中心点旋转90度
//顶部居中绘制一个圆
canvas.drawCircle(px/2, 20, 20, paint);
 
canvas.restore();//恢复画布状态
//右上角绘制一个圆
paint.setColor(Color.RED);
canvas.drawCircle(px-20, 20, 20, paint);

 

 

 

 

可以发现红色的圆依然在右上角,但是蓝色的圆到右边去了,接下来一步一步说明

调用save方法会保存当前画布的状态

然后rotate(90, px/2, py/2)方法会将画布旋转90度,

 

这时drawCircle(px/2, 20, 20, paint)方法在顶部居中绘制了一个蓝色的圆,但是由于画布被旋转了90度,所以圆被绘制在了右侧居中

 

接下来调用了restore方法将画布恢复,相当于调用rotate(-90, px/2, py/2),但是刚才蓝色的圆已经被绘制在屏幕上,此时不会再受到画布的影响,因此画布旋转之后圆还在屏幕靠右居中。

 

最后调用drawCircle(px-20, 20, 20, paint);在画布右上角在再绘制一个红色的圆,因为画布已经恢复成save前的状态,最后可以看到红色的圆是在右上角的,而蓝色的圆则在右侧居中。

 

需要注意的是restore只能回复到save之后,如果在save前已经调用过其他操作画布的方法,是不能通过restore还原的。

 

  • 大小: 5.9 KB
  • 大小: 6 KB
  • 大小: 8.2 KB
  • 大小: 8.4 KB
HTML5 canvas 是一个强大的绘图API,提供了一些方法来帮助开发者控制绘图状态。其中两个非常有用的方法是 save() 和 restore()。 save() 方法用于保存当前绘图状态,包括当前的变换矩阵、剪切区域和样式属性等。调用 save() 方法后,我们可以对绘图状态进行任意修改,而不会影响到之前保存的状态。 restore() 方法用于恢复之前保存的绘图状态。调用 restore() 方法后,我们可以回到之前保存的状态,并且继续在该状态下进行绘图操作。 这两个方法通常是成对使用的。例如,我们可以在进行一些复杂的绘图操作之前调用 save() 方法来保存当前状态,然后在绘制完成后调用 restore() 方法来恢复之前的状态。这样可以避免对后续绘图操作造成影响。 下面是一个简单的示例代码,演示了如何在 canvas 中使用 save() 和 restore() 方法: ```html <canvas id="myCanvas" width="200" height="100"></canvas> <script> var canvas = document.getElementById("myCanvas"); var ctx = canvas.getContext("2d"); // 保存当前状态 ctx.save(); // 绘制一个矩形,并修改一些属性 ctx.fillStyle = "red"; ctx.fillRect(10, 10, 50, 50); ctx.strokeStyle = "blue"; ctx.lineWidth = 3; ctx.strokeRect(20, 20, 30, 30); // 恢复之前的状态 ctx.restore(); // 绘制一个圆形,此时样式属性已经恢复到之前的状态 ctx.beginPath(); ctx.arc(100, 50, 30, 0, 2*Math.PI); ctx.fillStyle = "green"; ctx.fill(); </script> ``` 在上面的代码中,我们首先调用了 save() 方法来保存当前状态,然后绘制了一个红色填充、蓝色边框的矩形。接着,我们又调用了 restore() 方法来恢复之前保存的状态。最后,我们绘制了一个绿色的圆形,此时样式属性已经恢复到之前的状态。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值