美文网首页Android自定义View
Android LayoutParams的理解

Android LayoutParams的理解

作者: android源码探索 | 来源:发表于2019-07-07 15:57 被阅读0次

    欢迎大家下载我个人开发的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

    相关文章

      网友评论

        本文标题:Android LayoutParams的理解

        本文链接:https://www.haomeiwen.com/subject/vbibhctx.html