viewgroup onMeasure例子

来源:互联网 发布:黑色星期五 软件 编辑:程序博客网 时间:2024/06/05 09:59
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {        int measureWidth = MeasureSpec.getSize(widthMeasureSpec);        int measureHeigth = MeasureSpec.getSize(heightMeasureSpec);        setMeasuredDimension(measureWidth, measureHeigth);        // TODO Auto-generated method stub        for(int i= 0;i<getChildCount();i++){            View v = getChildAt(i);            Log.v(TAG, "measureWidth is " +v.getMeasuredWidth() + "measureHeight is " +v.getMeasuredHeight());            int widthSpec = 0;            int heightSpec = 0;            LayoutParams params = v.getLayoutParams();            if(params.width > 0){                widthSpec = MeasureSpec.makeMeasureSpec(params.width, MeasureSpec.EXACTLY);            }else if (params.width == -1) {                widthSpec = MeasureSpec.makeMeasureSpec(measureWidth, MeasureSpec.EXACTLY);            } else if (params.width == -2) {                widthSpec = MeasureSpec.makeMeasureSpec(measureWidth, MeasureSpec.AT_MOST);            }            if(params.height > 0){                heightSpec = MeasureSpec.makeMeasureSpec(params.height, MeasureSpec.EXACTLY);            }else if (params.height == -1) {                heightSpec = MeasureSpec.makeMeasureSpec(measureHeigth, MeasureSpec.EXACTLY);            } else if (params.height == -2) {                heightSpec = MeasureSpec.makeMeasureSpec(measureWidth, MeasureSpec.AT_MOST);            }            v.measure(widthSpec, heightSpec);        }    }

首先判断params.width的值是多少,有三种情况。

如果是大于零的话,及传递的就是一个具体的值,那么,构造MeasupreSpec的时候可以直接用EXACTLY。

如果为-1的话,就是MatchParent的情况,那么,获得父View的宽度,再用EXACTLY来构造MeasureSpec。

如果为-2的话,就是wrapContent的情况,那么,构造MeasureSpec的话直接用一个负数就可以了。

0 0