首先在创建新的控件或修改现有的控件时,我们都会涉及到重写控件或View的onDraw方法。
onDraw方法会传入一个Canvas对象,它是你用来绘制控件视觉界面的画布。
在onDraw方法里,我们经常会看到很多调用save和restore方法,他们具体是做什么用的,有什么我们需要知道的呢?
save:用来保存Canvas的状态。save之后,可以调用Canvas的平移、放缩、旋转、错切、裁剪等操作。
restore:用来恢复Canvas之前保存的状态。防止save后对Canvas执行的操作对后续的绘制有影响。
save和restore要配对使用(restore可以比save少,但不能多),如果restore调用次数比save多,会引发Error。
下面我们写下代码测试下:
int px = getMeasuredWidth();
int py = getMeasuredWidth();
// 背景
canvas.drawRect(0, 0, px, py, backgroundPaint);
canvas.save();
canvas.rotate(90, px/2, py/2);
// 向上的箭头
canvas.drawLine(px / 2, 0, 0, py / 2, linePaint);
canvas.drawLine(px / 2, 0, px, py / 2, linePaint);
canvas.drawLine(px / 2, 0, px / 2, py, linePaint);
canvas.restore();
// 圆点
canvas.drawCircle(px - 10, py - 10, 10, linePaint);
那么我们了解下canvas.rotate具体做了什么,这是我开始不理解的地方而且非常重要,看图
顺时针转动90度后
我们需要知道的是坐标系也跟着变了,所以你画的向上的箭头实际上就是向右的
然而ondraw或者restore之后画布会回到之前的状态,但是你之前画的图不会跟着回去了,这点也很重要。
以上,如有错误请指正。