Android LayoutParams的理解
2019-07-07 本文已影响0人
android源码探索
欢迎大家下载我个人开发的app安琪花园
之前一直不理解ViewGroup里面的这几个方法:
LayoutParams generateLayoutParams(AttributeSet attrs)
通过源码分析,调用此方法是通过xml文件解析来添加到父容器上面会调用此方法。
具体的源码如下:
public View inflate(XmlPullParser parser, @Nullable ViewGroup root, boolean attachToRoot) {
synchronized (mConstructorArgs) {
省略....
if (root != null) {
params = root.generateLayoutParams(attrs);
if (!attachToRoot) {
// Set the layout params for temp if we are not
// attaching. (If we are, we use addView, below)
temp.setLayoutParams(params);
}
}
rInflateChildren(parser, temp, attrs, true);
if (root != null && attachToRoot) {
root.addView(temp, params);
}
省略...
}
}
return result;
}
}
会先调用父窗口的generatLayoutParams方法
然后在addView的时候 把LayoutParams传进去
LayoutParams generateLayoutParams(ViewGroup.LayoutParams p)
这个方法执行场景是什么情况呢? 我们通过源码来分析 :
任何添加到父容器的view都会执行上面的方法
`
public void addView(View child, LayoutParams params) {
addView(child, -1, params);
}
`
这个方法最终会调用
addViewInner(child, index, params, false);
这个方法里面会对params参数进行判断 如果为空的情况下就会执行此方法
具体的源码是:
private void addViewInner(View child, int index, LayoutParams params,
boolean preventRequestLayout) {
省略。。。
if (!checkLayoutParams(params)) {
params = generateLayoutParams(params);
}
省略。。。
}
checkLayoutParams的方法就是对params进行非空判断
protected boolean checkLayoutParams(ViewGroup.LayoutParams p) {
return p != null;
}
LayoutParams generateDefaultLayoutParams()
这个方法的调用时机是在父容器调用add方法时,这个时候 会执行到generateDefaultLayoutParams方法
具体的源码如下:
public void addView(View child, int width, int height) {
final LayoutParams params = generateDefaultLayoutParams();
params.width = width;
params.height = height;
addView(child, -1, params);
}
当明白了这几个方法的作用时,我写了一个scrollView的动画,就是通过重写LayoutParams generateLayoutParams(AttributeSet attrs)
公众号: