1. 程式人生 > >淺析Margin和Padding屬性

淺析Margin和Padding屬性

Magin:有邊緣的意思,在Android佈局中的使用方式是

android:layout_margin=“XXdp”,看到這個不免想到layout是父佈局來控制子控制元件的。

而這個margin屬性就是父控制元件來控制子控制元件的邊緣位數狀況的,俗稱“外邊距”。


Padding:是填充的意思,在Android佈局中的使用方式是

android:padding=“XXdp”,這個就是子控制元件來控制自己的屬性,拿TextView舉例

這個是文字內容和控制元件邊緣的距離,俗稱“內邊距”。


上圖中除了紅色框以內的區域,其他都是Padding填充的區域:

android:padding="16dp"

android:layout_width="200dp"

android:layout_height="wrap_content"

結論1:當寬高設定為wrap_content時,Padding會增加控制元件的寬高;

結論2:當寬高設定為精確的dp時,Padding會對控制元件的內容(這裡是文字)有影響;

驗證結論2:

android:padding="10dp"

android:layout_width="200dp"

android:layout_height="30dp"

如圖:


1.Padding的基本使用

在XML中:

android:padding="XXdp"

android:paddingBottom="XXdp"

android:paddingLeft="XXdp"

android:paddingRight="XXdp"

android:paddingTop="XXdp"

android:paddingStart="xxdp"

android:paddingEnd="xxdp"

在JavaCode中

setPadding(left,top,right,bottom);

setPaddingRelative(start,top,end,bottom);

這裡特別說明下Start和End屬性:

這2個屬性是在Api17(4.2)以後開始支援,為了支援RTL佈局(Right-to-Left),

在我國的閱讀方式是:從左到右,而國外有些國家是:從右到左的

如果是從左到右,start=left,end=right。反之,即在RTL佈局中start=right,end=left;

TextView中的相關原始碼:

caseLAYOUT_DIRECTION_RTL:

mUserPaddingLeftInitial= padding.right;

mUserPaddingRightInitial= padding.left;

internalSetPadding(padding.right, padding.top, padding.left, padding.bottom);

break;

caseLAYOUT_DIRECTION_LTR:

default:

mUserPaddingLeftInitial= padding.left;

mUserPaddingRightInitial= padding.right;

internalSetPadding(padding.left, padding.top, padding.right, padding.bottom);

當然如果不用相容國外的,你也可以完全不用這2個屬性,不用在乎warning。

如果有強迫症的話,可以寫上所有屬性。注意start所對應的是left還是right。

android:paddingStart="16dp"

android:paddingEnd="0dp"

android:paddingLeft="16dp"

android:paddingRight="0dp"

2.Padding的注意事項

2.1.將Padding設定為負值無效:

我們知道padding為正值的時候,如果寬高為定值,會影響到文字內容。如果寬高為wrap_content,會影響到控制元件的寬高。

如果設定負值呢? 發現和“0dp”一樣的效果。

在View的原始碼中發現:

mUserPaddingLeftInitial,

topPadding >=0? topPadding :mPaddingTop,

mUserPaddingRightInitial,

bottomPadding >=0? bottomPadding :mPaddingBottom);

if(isLayoutRtl()) {

mPaddingLeft= (mUserPaddingEnd>=0) ?mUserPaddingEnd:mUserPaddingLeftInitial;

mPaddingRight= (mUserPaddingStart>=0) ?mUserPaddingStart:mUserPaddingRightInitial;

}else{

mPaddingLeft= (mUserPaddingStart>=0) ?mUserPaddingStart:mUserPaddingLeftInitial;

mPaddingRight= (mUserPaddingEnd>=0) ?mUserPaddingEnd:mUserPaddingRightInitial;

}

從這些三目運算子,可以得知;如果這個值大於0,則給予這個值,否則結果為0

2.2.Padding設定在固定的寬高控制元件中需要注意文字顯示區域的問題

如結論2的效果

2.3.Padding是否可以和PaddingLeft等“小弟”一起使用

可以,當Padding存在的時候,PaddingLeft等“小弟”統統無效。

3.Magin的基本使用

在XML中

android:layout_margin="xxdp"

android:layout_marginBottom="xxdp"

android:layout_marginTop="xxdp"

android:layout_marginLeft="xxdp"

android:layout_marginRight="xxdp"

android:layout_marginEnd="xxdp"

android:layout_marginStart="xxdp"

在JavaCode中

由於margin屬性是由其父控制元件,所以需要從父控制元件獲得它的LayoutParams.

ViewGroup.MarginLayoutParams marginLayoutParams= (ViewGroup.MarginLayoutParams)tv.getLayoutParams();

marginLayoutParams.topMargin+=100;

tv.requestLayout();

4.Margin的注意事項

4.1.Margin可以設定為負值:

如果是marginleft設定負值,他就相當於設定marginright為正值。

android:layout_marginLeft="100dp"


android:layout_marginLeft="-100dp"


Margin可以設定負值,可以利用這一個特性來實現ListView的側滑刪除等效果。

4.2.Margin是否可以和MarginLeft等“小弟”一起使用?

可以一起使用,當Margin屬性存在的時候,MarginLeft等“小弟”通通無效。