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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM