LinearLayout的橫向和縱向布局問題

簡介

  • 問題
  • LinearLayout的orientation屬性
  • LinearLayout的layout_gravity屬性
  • LinearLayout使用"orientation=horizontal/vertical",結(jié)合child view使用layout_gravity的各種情況的表現(xiàn)。
  • 問題解答

問題:在使用LinearLayout的orientation=horizontal時(shí),使用layout_gravity="center"子布局只是縱向居中,并沒有橫向居中。

LinearLayout的orientation屬性

LinearLayout的布局方式有兩種,即由orientation屬性控制,默認(rèn)orientation=horizontal。在使用as作為開發(fā)工具的時(shí)候,如果在LinearLayout中出現(xiàn)多于兩個(gè)的同級子布局時(shí),as會強(qiáng)制要求設(shè)置顯示設(shè)置orientation屬性。

orientation屬性的值有兩個(gè):horizontal和vertical
分別表示橫向和縱向排列。

LinearLayout的layout_gravity屬性

layout_gravity屬性只有根布局是LinearLayout的情況下才能使用。表示子布局在父布局中的顯示方式。

layout_gravity有以下幾種值:
center:居中(橫向和縱向均居中)
center_horizontal:水平居中
center_vertical:垂直居中
以上都是常用的屬性,還有一些其他不常用的屬性,就不再贅述(clip_horizontal、clip_vertical、end、start、left、right…)。

LinearLayout使用"orientation=horizontal/vertical",結(jié)合child view使用layout_gravity的各種情況的表現(xiàn)。

兩種情況:
1、orientation=horizontal
子布局只能垂直方向的設(shè)置有效,不會水平方向的設(shè)置有效。
如果設(shè)置layout_gravity=center時(shí),只有垂直方向的設(shè)置有效,水平方向的設(shè)置無效。
2、orientation=vertical
子布局只能水平方向的設(shè)置有效,不會垂直方向的設(shè)置有效。
如果設(shè)置layout_gravity=center時(shí),只有水平方向的設(shè)置有效,垂直方向的設(shè)置無效。

解答

在查看LinearLayout的源碼的時(shí)候會發(fā)現(xiàn),LinearLayout在測量橫向和縱向的布局時(shí),有兩個(gè)方法分別為layoutVertical()和layoutHorizontal()分別用于測量橫向和縱向的布局位置。
我們就其中的一個(gè)方法進(jìn)行解釋:
layoutVertical():

void layoutVertical(int left, int top, int right, int bottom) {
    /**
      * 省略
      */
    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;
            }
            final int layoutDirection = getLayoutDirection();
            final int absoluteGravity = Gravity.getAbsoluteGravity(gravity, layoutDirection);
            switch (absoluteGravity & Gravity.HORIZONTAL_GRAVITY_MASK) {
                case Gravity.CENTER_HORIZONTAL:
                    childLeft = paddingLeft + ((childSpace - childWidth) / 2)
                            + lp.leftMargin - lp.rightMargin;
                    break;

                case Gravity.RIGHT:
                    childLeft = childRight - childWidth - lp.rightMargin;
                    break;

                case Gravity.LEFT:
                default:
                    childLeft = paddingLeft + lp.leftMargin;
                    break;
            }

            if (hasDividerBeforeChildAt(i)) {
                childTop += mDividerHeight;
            }

            childTop += lp.topMargin;
            setChildFrame(child, childLeft, childTop + getLocationOffset(child),
                    childWidth, childHeight);
            childTop += childHeight + lp.bottomMargin + getNextLocationOffset(child);

            i += getChildrenSkipCount(child, i);
        }
    }
}

在for循環(huán)中僅僅是判斷了CENTER_HORIZONTAL、RIGHT、LEFT三中情況,即在orientation=vertical時(shí),只有水平居中和居左和居右有效,因此這就是為什么我們在設(shè)置layout_gravity=center時(shí),只有水平方向的設(shè)置有效果了。
同理layoutHorizontal()方法也是同樣的設(shè)置。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 第一類:屬性值為true或false android:layout_centerHrizontal 水平居中 an...
    殘?jiān)掠昙娂?/span>閱讀 1,293評論 0 5
  • Android 4.0的SDK已經(jīng)發(fā)布,在眾多的新增特性中,其中對開發(fā)者來說比較重要的特性之一,是新增的兩種界面布...
    扈博鑫閱讀 1,828評論 0 6
  • 一切世俗的權(quán)力都會使人成為無賴。在它的卵翼下,潛藏各色詭辯與偽善,是言詞的濫用,更超過正義道理,自詡專一的秩序,魔...
    小婦阿達(dá)閱讀 225評論 0 0
  • 一周總結(jié) 1.快樂痛苦四原則:同樣是有好多個(gè)消息要說,但根據(jù)消息不同要講求方式方法。 2.五商派寫作心法:用合理的...
    張琪77閱讀 126評論 0 0
  • 百度輸入“林徽因”,自動跳出“林徽因綠茶婊”匹配,林徽因已成綠茶婊之鼻祖??v觀其短暫的一生,拋開其對中國建筑之貢獻(xiàn)...
    秦時(shí)明月_閱讀 8,795評論 2 5

友情鏈接更多精彩內(nèi)容