UGUI学习笔记之布局属性(Layout Properties)和Horizontal Layout Group的探究

布局属性 (Layout Properties)

每个包含Rect Transform的UI元素都包含有布局属性(Layout Properties),其具体包含六条属性:

  1.Min Width

  2.Min Height 

  3.Preferred Width

  4.Preferred Height

  5.Flexible Width

  6.Flexible Height

可以在Inspector面板查看(仅有Rect Transform的UI元素不显示

 布局属性的作用

  每个UI元素都有Rect Transform组件,UI元素的的大小、位置等信息是由这个组件确定的。看这六条布局属性的名字,也能猜出布局属性一定也和UI元素的大小(宽高)有关。  其实它也是用来设置UI元素大小的,只不过默认状态下它还不起任何作用(看到后面就知道,它起作用的时候,也和RectTransform起的作用不同)。默认状态下,这六条属性只是纯粹的文字信息,并不会对具有这些信息的UI元素的位置和大小等产生实际影响。实际上,这六条属性只是一个辅助作用,我们可以通过某些中介(具体后面会说明)根据这六条属性设置的值去自动的修改Rect Transform组件中的width和height属性,以达到修改UI元素大小的效果。

  如何设置这六条属性呢?这六条属性的默认值均为0,一些组件可以手动或自动的修改它们的值。譬如Text组件会根据文本内容的多少去设置,我们也可以通过Layout Element组件去手动的自定义这些属性的值。

 

 (新建的Text的布局属性就不全为0)

 

 (layout Element可以随意设置布局属性的值,且优先级高于其他组件设置的值)


  如何让布局属性起作用,以及这六条属性的具体含义,请接着往下看。

 初步了解Horizontal Layout Group

Horizontal Layout Group组件可以让所有子项UI元素自动横向排列(一家人就是要整整齐齐)。

属性 说明
Padding 子项与此容器边缘的距离
Spacing  子项与子项之间的距离
Child Alignment 子项对齐方式,和word文档里的对齐方式一个意思
其他属性在下面详细介绍

 一白实验室

  1.为了方便研究,我在这里创建了四个Image,将他们的位置随意摆放,同时把它们设置为不同的颜色,并调整为如下结构

  2.然后给RedImageGreenImageBlueImage都添加了LayoutElement组件,并设为下图中的值

RedImage GreenImage BlueImage

  3.然后给ParentImage添加一个Horizontal Layout Group组件,在添加上该组件的瞬间,它的三个子项整整齐齐的排成了一排,同时三个子项的PosX和PosY属性变为不可修改状态。说明Horizontal Layout Group组件可以控制所有子项的位置,并让所有子项整齐排列。

  4.当我们随意手动修改ParentImage的大小时,发现三个子项的大小并不会发生任何变化,此时布局属性(Layout Properties)似乎还没启任何作用。

  5.勾选ParentImage的Horizontal Layout Group组件的Control Child Size属性,再次随意调整ParentImage的大小,发现子项随其大小变化而变化。仔细观察在变化过程中,ParentImage的Width属性和三个子项的Width属性发现有如下规律(以下标蓝色的文字表示布局属性Layout Properties):

调整ParentImage(在这里可以看作一个容器)示例图

1.

水平方向:当容器Width小于等于所有子项Min Width之和时,三个子项的Width都保持Min Width不变

垂直方向:当容器Height小于等于某个子项的Min Height时,该子项的Heighht保持Min Height不变

 

所以Min Width/Height的含义就是最小值,从该属性名上也能看出。

2.

水平方向:

  当容器Width大于所有子项的Min Width之和并小于等于所有子项的Preferred Width之和时。暂且把容器width减去所有子项的Min Width之和称为多余空间,

  所有子项将按”Preferred减去Min“(要求Preferred要大于Min )的比值来分配多余空间,直至所有子项同时达到Preferred Width

垂直方向:

  当容器Height大于某个子项的Min Height时,该子项将填充该子项所在列的多余空间,直至该子项的Height达到Prefereed Height

 

水平方向这么说可能看不懂了,举个具体例子:

已知三个子项的Min Width均为100(见右图一),容器当前width为600

RedImage的Preferred Width - Min Width为负数,所以保持最小值Min Width不变。

GreenImage的Preferred Width - Min Width为100

BlueImage的Preferred Width - Min Width 为400

所以要把容器的多余空间600-100x3=300按100:400即1:4的比例分给GreenImage和BlueImage

所以GreenImage的Width = 100+300/(1+4)*1 = 160

BlueImage的Widht = 100+300/(1+4)*4 = 340

所以三个子项的Width分别为100,160,340和实际相符。

 

 (图一)

 

 3.

水平方向:

  当容器width大于所有子项的Preferred Width之和(如果Preferred 小于 Min 则用Min代替)时。暂且把容器Width减去所有子项的Preferred width之和称为剩余空间

  所有子项将按Flexible Width的比例来分配剩余空间

 

  举个例子:

  容器width为900,剩余空间则为900-100-200-500=100

  RedImage的Flexible默认为0

  GreenImage的Flexible的值为3

  BlueImage的Flexible的值为7

  所以三个子项获得的剩余空间为0,30,70

  所以三个子项的width分别为:100+0,200+30=230,500+70=570

 

垂直方向则是直接填充。

 


Horizontal Layout Group

属性 说明
Padding 子项与此容器边缘的距离
Spacing  子项与子项之间的距离
Child Alignment 子项对齐方式,和word文档里的对齐方式一个意思
Control Child Size

 控制所有子项的大小,勾选此项后,所有子项的Width、Height的属性会变成不可手动修改的状态。

所有子项的大小的设置会依据每个子项的布局属性(Layout Properties)以及此挂载Horizontal Layout Group的物体的大小。

具体原则见上文

Use Child Scale

 如果子项进行过缩放(scale属性不为1),那么就按照缩放后的宽高进行排版。

若不勾选,则按照子项缩放前的宽高进行排版。

Child Force Expand

若没有勾选Control Child Size,有几个子项就将容器划分为几等份,每个子项分别处在处在每一等份的开头。

若勾选了Control Child Size,容器的多余空间会直接按照Flexible Witdh的比例进行分配(如果没有设置Flexible的值,则用1)

 

 

如果更加仔细的观察会发现:当添加上Horizontal Layout Group组件时,该物体的布局属性Layout Properties的值会根据子物体的布局属性进行自动的设置。

实际使用中应该不用过多纠结空间的分配是按照什么比例进行的,只需要记住什么情况下会调整子项的大小即可。这一篇写得有点乱,等熟练掌握了再回过头来整理。

参考文章:https://blog.csdn.net/qq_28849871/article/details/79528697

posted @ 2021-02-15 17:06  一白梦人  阅读(1200)  评论(0编辑  收藏  举报