Android之布局文件中属性gravity与layout_gravity

时间:2024-02-17 10:18:00

一、 前言

在写布局界面时,发现gravity与layout_gravity属性,有时起作用,有时不起作用,虽然知道它俩的大概区别,但是具体在什么情况下使用,就有些模糊不清了,又不是特别难的东西,只是缺乏归类整理。目前知道它俩的区别是,gravity属性是用来设置控件中的内容的位置,layout_gravity属性是用来设置当前子控件在父控件中的位置。

二、可以设置的值

  1. 属性gravity:center_horizontal、center_vertical、 center、top、bottom、left、right、start、end、clip_horizontal、clip_vertical、fill、fill_horizontal、fill_vertical。
  2. 属性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

  1. 给RelativeLayout设置gravity属性为center
    这里写图片描述
    可以看到TextView的位置成为RelativeLayout的正中间
  2. 给TextView设置gravity属性为center
    这里写图片描述
    可以看到TextView里的文字成为TextView的正中间
  3. 为了避免gravity影响,这里现将刚才设置的gravity的属性删除;由于layout_gravity的属性是设置子空间在父控件的位置,所以这里将只能设置TextView的layout_gravity属性。当我去设置这个属性时,发现在TextView的属性中竟然找不到layout_gravity。

3.2 线性布局LinearLayout

  1. 给LinearLayout设置gravity属性为center
    这里写图片描述
    可以看到TextView的位置成为LinearLayout的正中间
  2. 给TextView设置gravity属性为center
    这里写图片描述
    可以看到TextView里的文字成为TextView的正中间
  3. 为了避免gravity影响,这里现将刚才设置的gravity的属性删除;由于layout_gravity的属性是设置子空间在父控件的位置,所以这里将只能设置TextView的layout_gravity属性,将它的值设置为center。
    这里写图片描述
    可以看到TextView在竖直方向上是居中,水平方向上未居中。(我的线性布局是水平方向的)
  4. 然后我将线性布局设置为竖直方向
    这里写图片描述
    可以看到TextView在水平方向是居中,竖直方向上未居中。

3.3 帧布局FrameLayout

  1. 给FrameLayout设置gravity属性为center
    这里写图片描述
    可以看到,当设置FrameLayout的gravity属性为center时,TextView的位置没有变化的。
  2. 给TextView设置gravity属性为center
    这里写图片描述
    可以看到TextView里的文字成为TextView的正中间
  3. 为了避免gravity影响,这里现将刚才设置的gravity的属性删除;由于layout_gravity的属性是设置子空间在父控件的位置,所以这里将只能设置TextView的layout_gravity属性,将它的值设置为center。
    啦啦啦
    可以看到TextView已经位于FrameLayout的正中间了。
    4、当TextView的gravity与layout_gravity的属性都设置为center时
    这里写图片描述

四、结论

  1. gravity设置的是控件内的内容,但是在FrameLayout中该属性是没有作用;
  2. layout_gravity设置的是子控件在父控件中的位置,但是相对布局的子控件没有该属性;
  3. layout_gravity设置的是子控件在父控件中的位置,如果线性布局是水平布局,则该属性只有竖直方向(center_vertical、top、bottom)上起作用,如果线性布局是竖直布局,则该属性只有在水平方向(center_horizontal、left、right)上起作用。