Android画布的保存,Android canvas状态保存和恢复

int state = canvas.save();保存已有的画布状态

canvas.restore(); 获取到之前保存的画布状态

canvas.getSaveCount();获取保存了几次画布状态

canvas.restore();恢复画布状态(如果save()3次,只调一次restore()方法只能恢复最后一次save()的状态,调2次才会恢复到第二次save()的状态)

canvas.restoreToCount(state);恢复指定的画布状态

canvas.saveLayer(0,0, 700, 700, mPaint);保存一个离屏图层

canvas.restoreToCount(layerId);将离屏图层的绘制内容恢复到canvas

/**

* 1.canvas内部对于状态的保存存放在栈中

* 2.可以多次调用save保存canvas的状态,并且可以通过getSaveCount方法获取保存的状态个数

* 3.可以通过restore方法返回最近一次save前的状态,也可以通过restoreToCount返回指定save状态。指定save状态之后的状态全部被清除

* 4.saveLayer可以创建新的图层,之后的绘制都会在这个图层之上绘制,直到调用restore方法

* 注意:绘制的坐标系不能超过图层的范围, saveLayerAlpha对图层增加了透明度信息

*/

Log.e("", "onDraw: "+canvas.getSaveCount());

canvas.drawRect(200, 200, 700, 700, mPaint);

int state = canvas.save();

Log.e("", "onDraw: "+canvas.getSaveCount());

canvas.translate(50,50);

mPaint.setColor(Color.GRAY);

canvas.drawRect(0,0,500,500, mPaint);

canvas.save();

Log.e("", "onDraw: "+canvas.getSaveCount());

canvas.translate(50,50);

mPaint.setColor(Color.BLUE);

canvas.drawRect(0,0,500,500, mPaint);

canvas.restore();

Log.e("", "onDraw: "+canvas.getSaveCount());

// canvas.restore();

// canvas.restoreToCount(state);

Log.e("", "onDraw: "+canvas.getSaveCount());

canvas.drawLine(0,0, 400,500, mPaint);

2c0b2af90472

保存恢复.png

创建离屏画布

canvas.drawRect(200,200, 700,700, mPaint);

int layerId = canvas.saveLayer(0,0, 700, 700, mPaint);

mPaint.setColor(Color.GRAY);

Matrix matrix = new Matrix();

matrix.setTranslate(100,100);

canvas.setMatrix(matrix);

canvas.drawRect(0,0,700,700, mPaint); //由于平移操作,导致绘制的矩形超出了图层的大小,所以绘制不完全

canvas.restoreToCount(layerId);

mPaint.setColor(Color.RED);

canvas.drawRect(0,0,100,100, mPaint);

2c0b2af90472

保存图层.png

在canvas.saveLayer()和canvas.restoreToCount(layerId);之间代码就可以做自己想做的事

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值