废话不多说,今天记录一下RelativeLayout两种实现子布局居中的方式和差异,先从需求开始,接到UI如下需求:
这是系统消息的列表页,注意看第二个Item,左边用来显示时间的View上下间距都是54Px,且左右两个View都是居中的,下面看代码:
注意红框位置,直接在RelatveLayout中使用了android:gravity="center_vertical"属性使子View居中,看起来应该没问题,我们看一下实际效果:
可以看到,因为我们在代码中设置右边的TextSize比左大的原因,同样的条件下右边的View要比左边大,虽然我们期望两个子View都居中,但是实际只满足了右边的View居中的需求,左边的View和右边的View在同一起始位置但没有居中,所以android:gravity="center_vertical"属性并不能使所有子View无差别居中,只能满足最大子View居中的条件。
接下来我们来换一种实现方式:
这次我们改用在每一个子View中单独设置android:layout_centerVertical="true"属性来请求在父View中居中,这次看一下实现效果:
可以看到这一次我们确实实现了每一个子View单独居中的效果,所以可以的出结论:RelativeLayout使用属性android:gravity="center_vertical"期望使子View居中时只会以最大子View为参考,其他子View只是与最大子View同一起始位置,无法确保每一个子View居中,适用于子View相同大小的情况。
而对每一个子View设置属性android:layout_centerVertical="true"可以确保每一个子View单独对RelativeLayout请求居中,并不相互影响,所以适用范围更广。