Andorid View工作机制(3)—measure过程 下

来源:互联网 发布:如何才能避免淘宝同款 编辑:程序博客网 时间:2024/06/05 19:32
昨晚在上一篇博客总结了一下View的measure过程,今天看一下ViewGroup是怎么进行测量的。查看ViewGroup的源码,搜索measure和onMeasure方法都没有。那是怎么回事呢?通过源码可以发现,ViewGroup是一个abstract class,这个抽象类没有重写其父类View的onMeasure方法。那么它是如何完成测量过程的呢?搜索measure关键字可以搜索到ViewGroup有2个measure有关系的方法。measureChildren方法和measureChild方法。这2个方法的源码如下:
protected void measureChildren(int widthMeasureSpec, int heightMeasureSpec) {        final int size = mChildrenCount;        final View[] children = mChildren;        for (int i = 0; i < size; ++i) {            final View child = children[i];            if ((child.mViewFlags & VISIBILITY_MASK) != GONE) {                measureChild(child, widthMeasureSpec, heightMeasureSpec);            }        }    }
通过代码,我们可以看出这个方法会遍历子View,如果字View不是出于GONE状态,那么就执行子元素的measureChild方法,进而执行子View的measure过程。
protected void measureChild(View child, int parentWidthMeasureSpec,            int parentHeightMeasureSpec) {        final LayoutParams lp = child.getLayoutParams();        final int childWidthMeasureSpec = getChildMeasureSpec(parentWidthMeasureSpec,                mPaddingLeft + mPaddingRight, lp.width);        final int childHeightMeasureSpec = getChildMeasureSpec(parentHeightMeasureSpec,                mPaddingTop + mPaddingBottom, lp.height);        child.measure(childWidthMeasureSpec, childHeightMeasureSpec);    }
查看measureChild的方法可以看出,这个过程的思路就是将方法的LayoutParams(布局参数)取出,,通过getChildMeasureSpec获取元素的MeasureSpec,然后将MeasureSpec作为参数传递给子View,执行measure方法进行测量。至于ViewGroup为什么不重写View的onMeasure方法呢?因为各种ViewGroup的布局效果并不一致。无法在ViewGroup中就给出统一的实现。在具体的ViewGroup中,才会对onMeasure方法进行重写。
0 0