一般自定义View控件,都要重写onMeasure(int widthMeasureSpec, int heightMeasureSpec)和onDraw(Canvas canvas)两个方法,其中onMeasure方法的作用是计算控件的大小,onDraw方法的作用是显示控件的内容。
因为onDraw方法网上都有很多教程,所以本文不讲。本文重点讲解的是onMeasure这个实用性很强,但又容易出现错误的方法。
重写onMeasure方法的有以下几个步骤:
1、获得控件宽度(width)的MODE值
2、根据MODE值获得width的大小
3、获得控件高度(height)的MODE值
4、根据MODE值获得height的大小
5、设置控件大小
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// TODO Auto-generated method stub
int width = 0;
int height = 0;
//获得宽度MODE
int modeW = MeasureSpec.getMode(widthMeasureSpec);
//获得宽度的值
if (modeW == MeasureSpec.AT_MOST) {
width = MeasureSpec.getSize(widthMeasureSpec);
}
if (modeW == MeasureSpec.EXACTLY) {
width = widthMeasureSpec;
}
if (modeW == MeasureSpec.UNSPECIFIED) {
width = 600;
}
//获得高度MODE
int modeH = MeasureSpec.getMode(height);
//获得高度的值
if (modeH == MeasureSpec.AT_MOST) {
height = MeasureSpec.getSize(heightMeasureSpec);
}
if (modeH == MeasureSpec.EXACTLY) {
height = heightMeasureSpec;
}
if (modeH == MeasureSpec.UNSPECIFIED) {
//ScrollView和HorizontalScrollView
height = 400;
}
//设置宽度和高度
setMeasuredDimension(width, height);
}
很多人在重写onMeasure的时候,容易忽略MODE=MeasureSpec.UNSPECIFIED这个值,而忽略给width和height市值值了,以致控件在放置Scrollview和HorizontalScrollView控件的时候,自定义View就无法显示了,出现这个的原因是,自定义View的控件值一直是0,所以自定义View的大小是0,就理所当然的消失了。