android LayoutParams和MarginLayoutParams

android LayoutParams和MarginLayoutParams

LayoutParams

  • 相信大家或多或少都使用过LayoutParams,作为加载layout布局的主力,不论是在xml文件中使用layout进行布局,或者是在 代码中通过LayoutParams.setParams进行布局,都是子控件告诉父控件自己应该如何摆放的一种方式。

  • 在自定义view中,View的测量宽高是由父控件的MeasureSpec和View自身的LayoutParams共同决定的,LayoutParams里面存放着他的具体大小属性,例如Android:layout_width = “match_parent都是LayoutParams的一种应用。

  • 每一个view都有自己的特定的属性,例如background,color,但是这些都是它自己特有的,而LayoutParams是明确当前view在父类控件中如何摆放的,从而确定当前的位置。

MarginLayoutParams

  • 当我们设置了layout时候,是不是感觉还缺少了点什么,仅仅只是确定了他的大小,要是我想要测定他的位置怎么弄,就要用到MarginLayoutParams ,通过startMargin方法,确定他的间隔大小,就可以进行一个完整的布局操作。
 public MarginLayoutParams(Context c, AttributeSet attrs) {
            super();

            TypedArray a = c.obtainStyledAttributes(attrs, R.styleable.ViewGroup_MarginLayout);
            setBaseAttributes(a,
                    R.styleable.ViewGroup_MarginLayout_layout_width,
                    R.styleable.ViewGroup_MarginLayout_layout_height);

            int margin = a.getDimensionPixelSize(
                    com.android.internal.R.styleable.ViewGroup_MarginLayout_layout_margin, -1);
            if (margin >= 0) {
                leftMargin = margin;
                topMargin = margin;
                rightMargin= margin;
                bottomMargin = margin;
            } else {
                leftMargin = a.getDimensionPixelSize(
                        R.styleable.ViewGroup_MarginLayout_layout_marginLeft,
                        UNDEFINED_MARGIN);
                if (leftMargin == UNDEFINED_MARGIN) {
                    mMarginFlags |= LEFT_MARGIN_UNDEFINED_MASK;
                    leftMargin = DEFAULT_MARGIN_RESOLVED;
                }
                ... 
            }
            ...
    }        
  • 从上面的源码可以看出,该函数将通过传入的属性值,首先获取到layoutMargin,如果该值不存在,才会挨个获取layoutLeftMargin等值。

  • 当完成上面的步骤,就可以通过addView将view添加进去,通过翻看addView的源码可以看到不论是何种方式进入最终都会调用如下的方法

public void addView(View child, int index) {
        LayoutParams params = child.getLayoutParams();
        if (params == null) {
            params = generateDefaultLayoutParams();
            if (params == null) {
                throw new IllegalArgumentException("generateDefaultLayoutParams() cannot return null");
            }
        }
        addView(child, index, params);
    }
  • 首先会判定LayoutParams 是否存在,如果不存在则会调用generateDefaultLayoutParams()方法创建一个对应的LayoutParams来达到完成布局的作用。
 @Override
    protected LayoutParams generateDefaultLayoutParams() {
        if (mOrientation == HORIZONTAL) {
            return new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        } else if (mOrientation == VERTICAL) {
            return new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
        }
        return null;
    }

可以看到LinerLayout 中的 generateDefaultLayoutParams方法很简单,对产生的LayoutParams进行了修改,如果是横向的,则都设置为WRAP_CONTENT,如果是竖直的则将宽度设置为MATCH_PARENT。

  • 通过重写相应viewGroup的LayoutParams方法可以对自定义的viewGroup进行相应的布局补充,达到自己的效果
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值