1、源码
①设定了子view的位置
layout()方法用于确定view自己本身在父布局中的位置,onLayout()方法用于确定子view的位置
如果大小发生了变化,则重新布局
②setOpticalFrame内部也是调用了setFrame方法,设置了子view的位置
③将传进来的左、上、右、下的值与原来的值做对比,只要有其中任意一对不等,就说明view的大小发生了变化
④onLayout是一个空实现。在layout方法中去调用了onLayout用于指定子view的大小和位置。只有在viewgroup中才有onLayout
而viewgroup中onLayout不仅是一个空方法,而且还是一个抽象的。抽象的方法,说明viewgroup的子类都必须重写这个方法,在这个方法内依据自己的规则来实现布局
2、
①一般情况下只获取一次,但是在滑动等情况下系统会多次测量,所以在onMeasure()中获取view测量后的宽和高不一定特别准确,因为被测量了多次。为了避免这种情况,在onMeasure()的下一个阶段onLayout()中去获得测量过的结果
②获取时间不同,在measure结束之后就可以通过getMeasuredWidth()获取测量的大小,getWidth()是在layout结束之后调用该方法获得实际的大小
返回的计算方式是不同的,getMeasuredWidth()返回值是根据setWidthDimension()决定的,getWidth()由控件的右坐标值减左坐标值计算出来的
view.getLeft():子view左边距离父控件左边的距离
view.getRight():子view右边距离父控件左边的距离
view.getTop():子view上边距离父控件上边的距离
view.getBottom():子view下边距离父控件上边的距离
getRight()-getLeft()=宽
getBottom()-getTop()=高