序
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等“小弟”通通无效。