淺析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等“小弟”通通無效。