创建一个新的view的基本框架

基本的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方法时调用这个方法,否则,当父容器尝试放置控件时你的控件会引发一个异常。