1.首先贴上我试验成功的代码
01 |
protected void onMeasure( int widthMeasureSpec, int heightMeasureSpec)
{ |
03 |
int measureWidth
= MeasureSpec.getSize(widthMeasureSpec); |
04 |
int measureHeigth
= MeasureSpec.getSize(heightMeasureSpec); |
05 |
setMeasuredDimension(measureWidth,
measureHeigth); |
07 |
for ( int i= 0 ;i<getChildCount();i++){ |
08 |
View
v = getChildAt(i); |
09 |
Log.v(TAG, "measureWidth
is " +v.getMeasuredWidth()
+ "measureHeight
is " +v.getMeasuredHeight()); |
12 |
LayoutParams
params = v.getLayoutParams(); |
14 |
widthSpec
= MeasureSpec.makeMeasureSpec(params.width, MeasureSpec.EXACTLY); |
15 |
} else if (params.width
== - 1 )
{ |
16 |
widthSpec
= MeasureSpec.makeMeasureSpec(measureWidth, MeasureSpec.EXACTLY); |
17 |
} else if (params.width
== - 2 )
{ |
18 |
widthSpec
= MeasureSpec.makeMeasureSpec(measureWidth, MeasureSpec.AT_MOST); |
21 |
if (params.height
> 0 ){ |
22 |
heightSpec
= MeasureSpec.makeMeasureSpec(params.height, MeasureSpec.EXACTLY); |
23 |
} else if (params.height
== - 1 )
{ |
24 |
heightSpec
= MeasureSpec.makeMeasureSpec(measureHeigth, MeasureSpec.EXACTLY); |
25 |
} else if (params.height
== - 2 )
{ |
26 |
heightSpec
= MeasureSpec.makeMeasureSpec(measureWidth, MeasureSpec.AT_MOST); |
28 |
v.measure(widthSpec,
heightSpec); |
解释一下:
首先判断params.width的值是多少,有三种情况。
如果是大于零的话,及传递的就是一个具体的值,那么,构造MeasupreSpec的时候可以直接用EXACTLY。
如果为-1的话,就是MatchParent的情况,那么,获得父View的宽度,再用EXACTLY来构造MeasureSpec。
如果为-2的话,就是wrapContent的情况,那么,构造MeasureSpec的话直接用一个负数就可以了。