基本的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方法時調用這個方法,否則,當父容器嘗試放置控制項時你的控制項會引發一個異常。