LinearLayout 中的 gravity 属性
来源:互联网 发布:淘宝买家怎么提高信誉 编辑:程序博客网 时间:2024/06/05 17:51
在android UI布局中,有android:gravity 和 android:layout_gravity 两个属性可以设置控件的位置。在 LinearLayout 中,这两种属性的使用与其他布局稍有不同,在这里记下来。
在 LinearLayout 中,这两种属性的使用与 LinearLayout 的 android:orientation 属性有关。
附上源码(以 vertical 为例):
/** * Position the children during a layout pass if the orientation of this * LinearLayout is set to {@link #VERTICAL}. * * @see #getOrientation() * @see #setOrientation(int) * @see #onLayout(boolean, int, int, int, int) */ void layoutVertical() { final int paddingLeft = mPaddingLeft; int childTop = mPaddingTop; int childLeft; // Where right end of child should go final int width = mRight - mLeft; int childRight = width - mPaddingRight; // Space available for child int childSpace = width - paddingLeft - mPaddingRight; final int count = getVirtualChildCount(); final int majorGravity = mGravity & Gravity.VERTICAL_GRAVITY_MASK; final int minorGravity = mGravity & Gravity.HORIZONTAL_GRAVITY_MASK; if (majorGravity != Gravity.TOP) { switch (majorGravity) { case Gravity.BOTTOM: // mTotalLength contains the padding already, we add the top // padding to compensate childTop = mBottom - mTop + mPaddingTop - mTotalLength; break; case Gravity.CENTER_VERTICAL: childTop += ((mBottom - mTop) - mTotalLength) / 2; break; } } for (int i = 0; i < count; i++) { final View child = getVirtualChildAt(i); if (child == null) { childTop += measureNullChild(i); } else if (child.getVisibility() != GONE) { final int childWidth = child.getMeasuredWidth(); final int childHeight = child.getMeasuredHeight(); final LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) child.getLayoutParams(); int gravity = lp.gravity; if (gravity < 0) { gravity = minorGravity; } switch (gravity & Gravity.HORIZONTAL_GRAVITY_MASK) { case Gravity.LEFT: childLeft = paddingLeft + lp.leftMargin; break; case Gravity.CENTER_HORIZONTAL: childLeft = paddingLeft + ((childSpace - childWidth) / 2) + lp.leftMargin - lp.rightMargin; break; case Gravity.RIGHT: childLeft = childRight - childWidth - lp.rightMargin; break; default: childLeft = paddingLeft; break; } childTop += lp.topMargin; setChildFrame(child, childLeft, childTop + getLocationOffset(child), childWidth, childHeight); childTop += childHeight + lp.bottomMargin + getNextLocationOffset(child); i += getChildrenSkipCount(child, i); } } }
在以上源码中,mGravity 表示 LinearLayout 自身的 android:gravity 属性, majorGravity 和 minorGravity 由 mGravity 分别与 Gravity.VERTICAL_GRAVITY_MASK 和Gravity.HORIZONTAL_GRAVITY_MASK 做位与运算而来,应该是确定 mGravity 是垂直方向上还是水平方向上的属性值。
在布局过程中,先考虑 majorGravity, 如果它是垂直方向上的属性(与 orientation 一致),生效,否则无效。
之后考虑每个子视图自身的 android:layout_gravity 属性值,即代码中的 lp.gravity。从代码中可以看出,如果 lp.gravity 大于0, 就是说该子视图设置了 android:layout_gravity 属性,那么就使用它自己设置的,否则使用 minorGravity。然后判断得出的 gravity 是不是 水平方向上的(与 orientation 不一致的方向),如果是,生效,不是,直接无视。
由此,我们可以得出结论:
1. LinearLayout 自身的 android:gravity 属性可以设为任意 gravity 值,与其 orientation 方向一致的属性必然生效;不一致的属性可能生效,也可能不生效。不生效是被子视图自身的 android:layout_gravity 属性覆盖掉了。
2. 作为 LinearLayout 子视图的控件,它们的 android:layout_gravity 属性只有设成和 LinearLayout 的 orientation 不一致的属性的时候,才可以生效,否则不生效。并且,如果生效,是可以覆盖掉 LinearLayout 自身的 android:gravity 属性值带来的效果的(如果是同一方向上的属性的话)。
之前发的那篇写的不对,在这里向大家道歉,希望大家原谅!
这篇感觉对了,当然如果有问题的话,还请各位指教!
- LinearLayout 中的 gravity 属性
- android linearlayout 的gravity属性
- LinearLayout 属性layout_gravity与gravity的区别
- linearlayout布局的属性 gravity layout_gravity layout_weight
- android中LinearLayout中的orientation, gravity, layout_gravity
- LinearLayout中的layout_weight属性
- LinearLayout中的layout_weight属性
- LinearLayout中的layout_weight属性
- LinearLayout 中的 weight 属性
- LinearLayout中的layout_weight属性
- LinearLayout中的layout_weight属性
- LinearLayout中的layout_weight属性
- LinearLayout布局中的gravity与layout_gravity之惑
- LinearLayout中的layout_weight属性详解
- Android gravity属性详解(注:此属性是linearlayout的属性)
- 关于LinearLayout 布局中layout_gravity 属性和gravity 属性的异同。
- Android中的layout_gravity与gravity属性
- gravity属性
- 利用程序求周周率
- SQL Server Bulk Insert批量数据导入
- 2012手机市场:智能机大卖 仅四厂商盈利
- 2013年将成为传统店铺的末日?
- SQL 关闭/开启 自增列 语句
- LinearLayout 中的 gravity 属性
- Android Robotium自动化测试
- List of useful HTTP headers
- Android 在一个程序中启动另一个程序
- PreferenceActivity详解
- Apache配置绑定域名
- Android--自定义带提示文本的EditText组件
- 国运昌隆与技术人员的未来. - Maslow's hierarchy of needs
- Windows 8 app samples: http://code.msdn.microsoft.com/windowsapps/Windows-8-Modern-Style-App-Samples