Android 笔记 canvas.save()

canvas.save()/ restore()

在自定义view并且重写onDraw的时候,经常会用到canvas的坐标变换类的方法

比如canvas.rotate,canvas.tranlate,scale,或者直接使用matrix的concat(Matrix m)等等。

但是有一点要记得,那就是这些变换的方法是作用于整个canvas的,而不是单独某一个图像。
相当于是用普通的坐标在canvas上绘图,然后把整个canvas来变换,所以,所有上面的图像都会变换。

而为了给每次绘图都使用不同的变换,就有了canvas.save()和对应的canvas.restore()

每次调用save(),系统都会把坐标状态存入堆栈中,
而每次调用restore(),都会把栈顶的状态弹出来应用到当前的坐标系统。

也就是说,这个系统使用的是堆栈系统,所以可以多次调用save(),然后多次调用restore()

应用场景

一个典型的应用场景就是,希望每次变换坐标以后只应用到想要的图形中。

例如,我在5个区域希望绘制5个图形,所以,每次绘制一个以后就对当前的canvas应用一个坐标变换,将当前绘制的图形移动到目标位置。但是因为这种变换是对应整个坐标canvas的,所以之后的绘图也会变换到那个位置。如果需要在不同位置绘图,就只能不应用坐标变换,而是改变绘图的坐标。

如果使用了save和restore,就可以依然使用坐标还换,每次绘图的坐标还是相同的坐标。
在绘图之前,调用canvas.save(),这样,系统会把之前的状态保存起来。
绘图……
绘图结束以后,图像出现在目标位置。
为了开始下一次绘图,先调用canvas.restore()。这样,系统坐标会恢复上一次调用save()之前的状态。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值