创建一个新的视觉界面
基本的View类代表一个全空的100×100像素的正方形。为了改变控件的大小和显示更炫的视觉效果,最具代表的,你需要重写onMeasure和onDraw方法。
在onMeasure方法里,新的View会依据给的边界条件来计算它要占据的高度和宽度。在onDraw方法里,通过在画布上画画来创建视觉界面。
接下来的代码片段给出了一个新的View类的框架代码,我们将在接下来的章节更加深入的讨论:
public class MyView extends View {
// Constructor required for in-code creation
public MyView(Context context) {
super(context);
}
// Constructor required for inflation from resource file
public MyView (Context context, AttributeSet ats, int defaultStyle) {
super(context, ats, defaultStyle );
}
//Constructor required for inflation from resource file
public MyView (Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onMeasure(int wMeasureSpec, int hMeasureSpec) {
int measuredHeight = measureHeight(hMeasureSpec);
int measuredWidth = measureWidth(wMeasureSpec);
// 必须调用setMeasuredDimension方法
// 否则当控件放置时会引发一个运行时异常。
setMeasuredDimension(measuredHeight, measuredWidth);
}
private int measureHeight(int measureSpec) {
int specMode = MeasureSpec.getMode(measureSpec);
int specSize = MeasureSpec.getSize(measureSpec);
[ ... 计算View的高度 ... ]
return specSize;
}
private int measureWidth(int measureSpec) {
int specMode = MeasureSpec.getMode(measureSpec);
int specSize = MeasureSpec.getSize(measureSpec);
[ ... 计算View的宽度 ... ]
return specSize;
}
@Override
protected void onDraw(Canvas canvas) {
[ ... Draw your visual interface ... ]
}
}
注意:onMeasure方法中调用setMeasuredDimension方法;你必须总是在你重写onMeasure方法时调用这个方法,否则,当父容器尝试放置控件时你的控件会引发一个异常。