Unity——RectTransform詳解

本文講解順序
1.Anchor(Min,Max)
2.絕對與相對布局
3.Pivot
4.Offset(Min,Max)
5.SizeDelta
6.rect
7.anchoredPosition
8.Recttransform類中一些方法的介紹

1、錨點 Anchor

unity中的ui元素是有嚴格的父子關系的,子物體的位置是根據父物體的變化而變化的,而子物體和父物體聯系的橋梁就是Anchor。在recttransform面板中可以調整錨點的值
二者的值為:anchorMax(0.5,0.5),anchorMin(0,0) (默認左下角為0,0點,右上角為1,1點)


image.png

我把Anchor分為兩種情況
當anchorMax與anchorMin相等時,Anchor呈現為一個點,我稱之為錨點


image.png

當anchorMax與anchorMin不相等時,Anchor呈現為一個框,我稱之為錨框


image.png

2、絕對與相對布局

想要清晰的理解Recttransform的各個屬性,個人認為首先需要建立的第一個概念就是絕對布局以及相對布局這兩個概念。

2.1絕對布局

所謂的絕對布局,就是出現錨點的情況,此時的recttransform面板中的屬性變成了

image.png

PosX,PosY,PosZ,Width,Height,這五個屬性,首先說說WidthHeight,在絕對布局的情況下無論分辨率是多少,父物體多大,該UI元素的大小是恒定的
而剩下的PosX,PosY,PosZ表征的就是Pivot (第三部分有關于Pivot的講解) 到錨點的距離
image.png

所以如果使用了絕對布局,在采用不同分辨率的時候,該元素的大小恒定,可能就會出現在高分辨率情況下元素太小或者低分辨率情況下元素比屏幕大的情況

2.2相對布局

所謂相對布局,就是出現錨框的情況。在這種情況下UI元素的四個角,距離四個對應的錨點的距離是不變的,在這種情況下RectTransform的屬性又變為了Left,Top,Right,Bottom,PosZ,其中的PosZ表征的是該元素到父物體在Z軸上的偏移,利用這個值可以調整UI元素的顯示順序,不過我用的不多,這里不作太多討論。剩下的四個值應該很好理解了,就是UI元素的每一條邊距離父物體的每一條邊的距離。


image.png

image.png

3、中心點Pivot

image.png

4.OffsetMax,OffsetMin

這個值就是UI元素的右上角的坐標,減去AnchorMax的值,得到一個從AnchorMax指向元素右上角的向量(vector2類型),


image.png

那么這個值有什么用呢,因為這個值是一個可讀可寫的屬性,所以在錨框的情況下我們可以在代碼里面動態的去調整UI元素相對邊界的距離,其次更重要的是,利用這這兩個值就可以計算出sizeDelta的值了!

5、sizeDelta

錨點情況下的sizeDelta

image.png

在錨點情況下,offsetMax和Min的起點相同,根據向量相減的三角形法則,可以得到一個新的向量,這個新的向量的X和Y的大小正好UI元素的寬和高相等,所以在這個時候去設置sizeDelta的值,可以直接調整UI元素的大小

錨框情況下的sizeDelta

image.png

在錨框的情況下,offstMax減去Min,得到的將不再是UI元素的大小,而是一個新的奇怪的向量,這個向量代表的物理意義是,sizeDelta.x值就是錨框的寬度與UI元素的寬度的差值,sizeDelta.y的值就是錨框的的高度與UI元素的高度的差值
所以這個屬性之所以叫做sizeDelta,是因為在錨點情況下其表征的是size(大小),在錨框的情況下其表征的是Delta(差值)

3、rect

rect中的屬性,不與UI元素所在的位置有關,只和其自身屬性相關,所以其中的width和height屬性就可以讓我們在任何情況下取得元素的大小,而x和y屬性根據我的初步測試,如圖所示,表示的是Pivot的在UI元素中的坐標,以左下角為(0,0)點,右邊和上邊為坐標軸負向(這有一點奇怪,所以一般極少用到x和y這兩個值)


image.png

但是有一個問題,rect屬性是一個只讀的屬性,如果我們想要設置UI元素的大小的話,這好像又不適用了,所以RectTransform還提供了幾個非常有用的方法。

7、anchoredPosition

通過直接設置anchoredPosition的值可以改變UI元素的位置,但也是要分錨點錨框的情況

在使用錨點的情況下,anchoredPosition表征的是元素Pivot到Anchor的距離

 private RectTransform rectTransform;
    // Use this for initialization
    void Start()
    {
        rectTransform = GetComponent<RectTransform>();
        rectTransform.anchoredPosition = new Vector2(0, -100);
    }

image

在使用錨框的情況下,anchoredPosition表征的是元素Pivot到錨框中心點的距離

image

8.Recttransform類中一些方法的介紹

8.1 SetSizeWithCurrentAnchors(Animations.Axis axis, float size)

這個方法無論在絕對布局還是相對布局的情況下,都可以通過直接設置rect中的widthheight值來改變UI元素的大小。

private RectTransform rectTransform;
    // Use this for initialization
    void Start()
    {
        rectTransform = GetComponent<RectTransform>();
        rectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, 100);
        rectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, 100);    
    }

8.2 SetInsetAndSizeFromParentEdge(RectTransform.Edge edge, float inset, float size)

這個方法就比較冷門了可能,不過還是挺強大的。調用這個方法,可以根據父物體的Edge(某一邊)去布局。其中第一個參數就是用于確定基準的邊,第二個參數是UI元素的該邊界與父物體該邊界的距離,第三個元素是設定選定軸上UI元素的大小,可能說起來有點復雜,但是我上兩張圖相信各位就可以秒懂了。

首先以右邊界為基準

  private RectTransform rectTransform;
    // Use this for initialization
    void Start()
    {
        rectTransform = GetComponent<RectTransform>();
        rectTransform.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Right, 200, 400);
        //這種情況下我選定父物體的右邊界為基準,結果如下圖
    }

image

然后以下邊界為基準

 private RectTransform rectTransform;
    // Use this for initialization
    void Start()
    {
        rectTransform = GetComponent<RectTransform>();
        //rectTransform.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Right, 200, 400);
        rectTransform.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Bottom, 200, 400);
    }

image

在使用這個方法的時候要注意錨點也會改變,改變的規則為

  • 以左邊界為基準時,anchorMinanchorMaxy不變x變為0.
  • 以右邊界為基準時,anchorMinanchorMaxy不變x變為1.
  • 以上邊界為基準時,anchorMinanchorMaxx不變y變為1.
  • 以下邊界為基準時,anchorMinanchorMaxx不變y變為0.

8.3 GetWorldCorners(Vector3[] fourCornersArray)

使用這個方法,可以取得UI元素四個角的世界坐標,具體使用方法,先建立一個長度為4的vector3數組,然后傳進這個方法,調用一次后,數組被賦值,里面的四個元素分別是UI的左下角左上角右上角右下角

  private RectTransform rectTransform;
    // Use this for initialization
    void Start()
    {
        rectTransform = GetComponent<RectTransform>();
        Vector3[] corners = new Vector3[4];
        rectTransform.GetWorldCorners(corners);
        foreach (Vector3 corner in corners)
            Debug.LogWarning(corner);
    }

image

參考:http://www.lxweimin.com/p/4592bf809c8b

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,622評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,746評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,991評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,706評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,036評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,029評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,203評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,725評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,451評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,677評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,161評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,857評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,266評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,606評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,407評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,643評論 2 380

推薦閱讀更多精彩內容

  • 前言 最近一段時間的實習都是苦逼的在做ui,做移動端的,適配是永恒的話題,慶幸的是unity提供了一套強大的接口讓...
    巨龍餓了閱讀 66,594評論 20 140
  • 前言 最近要做UI,有時候需要在代碼中調整改變UI控件的屬性,比如位置、大小等,然而在NGUI里面,控制UI控件的...
    Zui閱讀 100,201評論 23 151
  • RectTransform繼承于Transform 上圖中的中間九個按鈕叫做絕對布局(也有人叫九宮格),邊上的七...
    黎明之鑰閱讀 1,716評論 0 2
  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標簽默認的外補...
    _Yfling閱讀 13,784評論 1 92
  • HTML 5 HTML5概述 因特網上的信息是以網頁的形式展示給用戶的,因此網頁是網絡信息傳遞的載體。網頁文件是用...
    阿啊阿吖丁閱讀 4,029評論 0 0