在创建新的控件或修改现有的控件时,我们都会涉及到重写控件Draw类的方法。
例如,在onDraw方法会传入一个Canvas对象,它是你用来绘制控件视觉界面的画布。
在onDraw方法里,我们经常会看到调用save和restore方法,它们到底是干什么用的呢?
❑ save:用来保存Canvas的状态。save之后,可以调用Canvas的平移、放缩、旋转、错切、裁剪等操作。
❑ restore:用来恢复Canvas之前保存的状态。防止save后对Canvas执行的操作对后续的绘制有影响。
save和restore要配对使用(restore可以比save少,但不能多),如果restore调用次数比save多,会引发Error。
例子如下:
public class TabGroup extends RadioGroup {
private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
private int redLineStartX=0;
public TabGroup(Context context) {
super(context);
}
public TabGroup(Context context, AttributeSet attrs) {
super(context, attrs);
}
/**当需要重写绘制viewgroup容器的子元素时可以考虑重写此方法*/
@Override
protected void dispatchDraw(Canvas canvas) {
super.dispatchDraw(canvas);
//1.保存原有绘制状态
canvas.save();
paint.setColor(Color.GRAY);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(2);
Path path = new Path();
int height = getHeight();
int width = getWidth();
path.moveTo(0,height);
path.lineTo(width,height);
canvas.drawPath(path,paint);
paint.setColor(Color.RED);
paint.setStrokeWidth(15);
path = new Path();
path.moveTo(redLineStartX,height);
path.lineTo(redLineStartX+getWidth()/getChildCount(),height);
canvas.drawPath(path,paint);
//3.恢复原有绘制状态
canvas.restore();
}//此方法在调用了invalidate()方法会重新执行
public void update(int position){
redLineStartX = position*(getWidth()/getChildCount());
invalidate();
}
}