一、 前言
在写布局界面时,发现gravity与layout_gravity属性,有时起作用,有时不起作用,虽然知道它俩的大概区别,但是具体在什么情况下使用,就有些模糊不清了,又不是特别难的东西,只是缺乏归类整理。目前知道它俩的区别是,gravity属性是用来设置控件中的内容的位置,layout_gravity属性是用来设置当前子控件在父控件中的位置。
二、可以设置的值
- 属性gravity:center_horizontal、center_vertical、 center、top、bottom、left、right、start、end、clip_horizontal、clip_vertical、fill、fill_horizontal、fill_vertical。
- 属性layout_gravity:center_horizontal、center_vertical、 center、top、bottom、left、right、start、end、clip_horizontal、clip_vertical、fill、fill_horizontal、fill_vertical。
结论:这两个属性可设置的值是相同的
三、不同布局中的表现
尽管Android中有五大布局,但是常用的也就三种,相对布局RelativeLayout、线性布局LinearLayout、帧布局FrameLayout,这里就看看这两个属性在这三种布局下的表现。为了方便观察,我在布局文件中写的都是,父控件就是这三种布局,子空间就是一个固定大小的TextView。
未设置前的图片:
3.1 相对布局RelativeLayout
- 给RelativeLayout设置gravity属性为center
可以看到TextView的位置成为RelativeLayout的正中间 - 给TextView设置gravity属性为center
可以看到TextView里的文字成为TextView的正中间 - 为了避免gravity影响,这里现将刚才设置的gravity的属性删除;由于layout_gravity的属性是设置子空间在父控件的位置,所以这里将只能设置TextView的layout_gravity属性。当我去设置这个属性时,发现在TextView的属性中竟然找不到layout_gravity。
3.2 线性布局LinearLayout
- 给LinearLayout设置gravity属性为center
可以看到TextView的位置成为LinearLayout的正中间 - 给TextView设置gravity属性为center
可以看到TextView里的文字成为TextView的正中间 - 为了避免gravity影响,这里现将刚才设置的gravity的属性删除;由于layout_gravity的属性是设置子空间在父控件的位置,所以这里将只能设置TextView的layout_gravity属性,将它的值设置为center。
可以看到TextView在竖直方向上是居中,水平方向上未居中。(我的线性布局是水平方向的) - 然后我将线性布局设置为竖直方向
可以看到TextView在水平方向是居中,竖直方向上未居中。
3.3 帧布局FrameLayout
- 给FrameLayout设置gravity属性为center
可以看到,当设置FrameLayout的gravity属性为center时,TextView的位置没有变化的。 - 给TextView设置gravity属性为center
可以看到TextView里的文字成为TextView的正中间 - 为了避免gravity影响,这里现将刚才设置的gravity的属性删除;由于layout_gravity的属性是设置子空间在父控件的位置,所以这里将只能设置TextView的layout_gravity属性,将它的值设置为center。
可以看到TextView已经位于FrameLayout的正中间了。
4、当TextView的gravity与layout_gravity的属性都设置为center时
四、结论
- gravity设置的是控件内的内容,但是在FrameLayout中该属性是没有作用;
- layout_gravity设置的是子控件在父控件中的位置,但是相对布局的子控件没有该属性;
- layout_gravity设置的是子控件在父控件中的位置,如果线性布局是水平布局,则该属性只有竖直方向(center_vertical、top、bottom)上起作用,如果线性布局是竖直布局,则该属性只有在水平方向(center_horizontal、left、right)上起作用。