Android自定义View

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)

scrollView动画

自定义百分比布局

公众号:

qrcode_for_gh_c78cd816dc53_344.jpg
上一篇下一篇

猜你喜欢

热点阅读