layout()与onLayout()
layout()与onLayout()两个方法是在view的layout(布置)过程中最重要的两个方法。onLayout()在layout()方法内部被调用。首先看看layout()方法的实现:
layout()方法的实现
public void layout(int l, int t, int r, int b) {
//确保测量工作已经完成
if ((mPrivateFlags3 & PFLAG3_MEASURE_NEEDED_BEFORE_LAYOUT) != 0) {
onMeasure(mOldWidthMeasureSpec, mOldHeightMeasureSpec);
mPrivateFlags3 &= ~PFLAG3_MEASURE_NEEDED_BEFORE_LAYOUT;
}
//保存旧的位置坐标
int oldL = mLeft;
int oldT = mTop;
int oldB = mBottom;
int oldR = mRight;
//重点步骤,changed表示该view的尺寸或位置是否发生了改变
boolean changed = isLayoutModeOptical(mParent) ?
setOpticalFrame(l, t, r, b) : setFrame(l, t, r, b);
//如果changed为true或是需要重新布置(比如measure过程结束)
if (changed || (mPrivateFlags & PFLAG_LAYOUT_REQUIRED) == PFLAG_LAYOUT_REQUIRED) {