Measure的本质是:把试图布局时的相对值转化为具体值。
MeasureSpec类包装了从parent传递下来的布局要求,每一个MeasureSpec代表了对宽度和高度的一个要求。
为什么布局需要父视图与子视图共同决定? 为什么不直接设置宽和高?
如果不这样就像HTML那样指定固定大小,这样会造成一个过大把另外一个挤出去。因为HTML是具有整个页面的控制权。
而Android是拆分开的,这样做保证了最末端的(界面开发)影响其他层级的布局,需要按照(控件开发)的规则来。
view.setWidth, view.setHeight ? 不是
需要通过measureChilde(view, width, height), 或者childView.measure();
View.getWidth(), View.getHight()
View.getMeasureWidth(), View.getMeasureHiegh()
一个未添加到视图中的? 但是有时getMesureHeight 依然是返回0。为什么?ec是一个android.view.View的内部类,封装了从父类传送到子类的布局要求信息。
ViewGroup提供的measure方法
measureChildren() - 该函数内使用for()循环调用measureChild()对每一个子视图进行measure操作
measureChild() - 为每一个子视图进行measure操作
measureChildWidthMargins() - 该函数与measureChild的唯一区别在于,measure时考虑把margin及padding也作为子视图大小的一部分
有一个约定:在覆写onMeasure方法的时候,必须调用 setMeasuredDimension(int,int)来存储这个View经过测量得到的measured width and height。如果没有这样做。将会由measure(int, int)方法抛出一个IllegalStateException。
measure(int widthMeasureSpec, int heightMeasureSpec),由于图片都是正方形,所以宽和高的值是一样的。
覆写onMeasure方法的时候,子类有责任确保measured height width至少为这个View的最小height和width。
setMeasuredDimension(resWidth, resHeight);
根据设置的图的尺寸,获取此控件的最小可用值(如果设置了android:minwidth)
如果没有背景图,那么取默认的尺寸,默认其实就是屏幕宽和高中的小值