浅析Margin和Padding属性

时间:2022-11-14 23:22:53

Magin:有边缘的意思,在Android布局中的使用方式是

android:layout_margin=“XXdp”,看到这个不免想到layout是父布局来控制子控件的。

而这个margin属性就是父控件来控制子控件的边缘位数状况的,俗称“外边距”。


浅析Margin和Padding属性

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

android:padding=“XXdp”,这个就是子控件来控制自己的属性,拿TextView举例

这个是文字内容和控件边缘的距离,俗称“内边距”。

浅析Margin和Padding属性

上图中除了红色框以内的区域,其他都是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"

如图:


浅析Margin和Padding属性

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"

浅析Margin和Padding属性

android:layout_marginLeft="-100dp"

浅析Margin和Padding属性

Margin可以设置负值,可以利用这一个特性来实现ListView的侧滑删除等效果。

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

可以一起使用,当Margin属性存在的时候,MarginLeft等“小弟”通通无效。