和onMeasure方法一样,onLayout也有个对应的layout方法。先看下layout和onLayout的区别
View中的layout方法
View的layout方法
这是一个被final修饰的方法,意味着无法被子类重写。但是内部事件还是调用了View中的layout方法
View中的onLayout是一个空实现的方法,通过layout方法将新的left、top、right、bottom传给onLayout。
官方注释在此视图应该时从布局调用(layout方法执行),此视图(onLayout方法执行)给每个孩子分配一个大小和位置。子类的派生类应该重写此方法并在每个子View上调用布局(layout方法)。
View的子类当然是ViewGroup了,所以ViewGroup更加像是一个View的管理器,用来实现对子View的大小和位置变化进行控制。简单来说View会通过onLayout方法进行确认View的显示位置。
ViewGroup中的onLayout方法是一个抽象方法,所以子类必须实现。并且调用View中的layout方法来确认View的位置和大小。
在layout方法中mLeft、mTop、mRight、mBottom这四个值是用来进行对View位置的摆放和大小的限制,是相对于父控件而言的。
如图白色区域是父View,黑色区域为子View。
针对getWidth()和getMeasuredWidth()进行分析 ,先看下区别
mMeasuredWidth这个值之前在 小试牛刀-onMeasure方法 中介绍过是View的实际大小宽对应的值是mMeasuredWidth,而mMeasuredWidth是通过setMeasuredDimension方法设置进来的。所以在measure方法结束后mMeasuredWidth才会有值,此时调用getMeasuredWidth可以获取对应的值。
在getWidth()中是通过mRight - mLeft的计算返回的结果。而mRight和mLeft这两个值,上面有介绍是通过layout传递过来的。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)