android开发中,我对save()和restore()两个方法,一直不是很明白,这几天有点空,仔细研究了这方面相关的知识,略有感悟,记录下来,以便查阅。
我们知道,canvas画布的原点在屏幕的左上角,以向右为X轴的正方向,以向下为y轴的正方向,如下图所示
图片是盗取别人博客的,希望不会被认为侵权,底部我会加上参考的博客链接。
我们使用canvas.drawXXX方法默认是以左上角为原点,水平向右为x轴正方向,垂直向下为y轴正方向来绘制的,当我们使用translate和Rotate方法时,这个坐标系就会有所变化,比如我们调用canvas.translate(100, 100);时,那么canvas的坐标系就会变成如下的图所示:
这时,canvas的原点就偏移了左上角100*100的距离,这个时候绘制的图形就会以新的坐标系为准,这时如果调用如下代码:
Rect rect1 = new Rect(0,0,400,220);
canvas.drawRect(rect1, paint);
显示就是上面那个图,各位看官,尽管我们开始的点是0*0,但是距离左上角还是有100*100的距离,这是为什么呢,因为是新的坐标系为准,新的坐标系的原点距离左上角就是100*100的,那么画出的图形也就距离左上角100*100了,这就不奇怪了。
这个时候,大家想下,我又想把坐标原点移到左上角去,怎么办呢,使用canvas.translate(-100, -100)吗,这个当然可以,但是还有更好的办法,即使用save()和restore(),我们在调用会改变canvas坐标系的操作前,调用save(),绘制完成之后调用restore(),就把canvas坐标系恢复到最初的状态。
还有个问题就是,我在save()和restore()之间变换坐标系所绘制的图形,在restore()被调用之后是不变的,因为改变的只是canvas的坐标系,已经绘制在界面上的图形还是保持之前的。
http://blog.csdn.net/harvic880925/article/details/39080931
https://www.zybuluo.com/coder-pig/note/214196