android LayoutParams和MarginLayoutParams
来源:互联网 发布:广东利为网络和多益 编辑:程序博客网 时间:2024/05/29 03:33
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 0
- android LayoutParams和MarginLayoutParams
- Android控件 - ViewGroup、ViewGroup.LayoutParams、ViewGroup.MarginLayoutParams简介
- LayoutParams、MarginLayoutParams、RelativeLayout.LayoutParams的区别?
- java.lang.ClassCastException: android.view.ViewGroup$LayoutParams cannot be cast to android.view.ViewGroup$MarginLayoutParams
- MarginLayoutParams
- android LayoutParams
- android LayoutParams
- Android LayoutParams
- Android中LayoutParams总结和用法
- Android中LayoutParams总结和用法
- Android中LayoutParams总结和用法
- Android中LayoutParams总结和用法
- Android中LayoutParams总结和用法
- Android中LayoutParams总结和用法
- android ViewGroup中的LayoutParams的理解和说明
- android分析windowManager,和WindowManager.LayoutParams类总结
- LayoutParams继承于Android.View.ViewGroup.LayoutParams.
- 【Android】动态UI : LayoutParams.addRule(...) LayoutParams.addRule(..., ...)
- 2017 7 12 测试
- Python中的排序函数argsort,sort,sorted
- 数据库varbinary字符串乱码问题
- 白话经典算法系列之九 从归并排序到数列的逆序数对(微软笔试题)
- 14.Scala中作为接口的trait、在对象中混入trait代码实战
- android LayoutParams和MarginLayoutParams
- 小球碰撞(NOIPD2T1难度)
- 求排列的逆序数
- python-filter
- 内核request_mem_region 和 ioremap的理解
- 支持任意张图片轮播的逻辑函数
- Spring Boot 启动加载数据 CommandLineRunner
- 函数指针的基本语法和回调函数
- linux内核之 phys_to_virt