@Override
protected void onMeasure(int widthMeasureSpec,int heightMeasureSpec) {
setMeasuredDimension(measureWidth(widthMeasureSpec), measureHeight(heightMeasureSpec));
}
private int measureWidth(intmeasureSpec) {
int result =0;
int specMode = MeasureSpec.getMode(measureSpec);
int specSize = MeasureSpec.getSize(measureSpec);
if(specMode == MeasureSpec.EXACTLY) {
result = specSize;
}else{
result =500;
if(specMode == MeasureSpec.AT_MOST) {
result = Math.min(result,specSize);
}
}
return result;
}
private int measureHeight(int measureSpec){
int result=0;
int specMode=MeasureSpec.getMode(measureSpec);
int specSize=MeasureSpec.getSize(measureSpec);
if(specMode==MeasureSpec.EXACTLY){
result=specSize;
}else{
result=500;
if(specMode==MeasureSpec.AT_MOST){
result=Math.min(result,specSize);
}
}
return result;
}
Android View 的测绘是在OnMeasure() 方法中执行的。所以自定义view的时候要重写这个方法。
1.android 系统提供了一个MeasureSpec的类可以帮助我们测绘。
测量模式有三种
(1)EXACTLY
即精确值模式,当我们将控件的layout_width属性或者layout_height属性指定固定的具体数值时,比如layout_width="100dp"或者指定值为match_parent属性时,系统使用的是精确模式
(2)AT_MOST
最大值模式。当控件的layout_width属性或者layout_height属性指定为wrap_content时,控件大小一般随着内从的变化或者子控件的变化而变化,此时控件的尺寸只要不超过父控件允许的最大值即可。
(3)UNSPECIFIED
这个属性比较奇怪——它不指定其大小测量模式,View想多大就多大,通常情况下在自定view时使用。