Unity UI大小動(dòng)態(tài)設(shè)置(Resize Unity UI RectTransform)

我們?cè)陂_(kāi)發(fā)過(guò)程中發(fā)現(xiàn),要調(diào)整Unity UI元素的大小,RectTransform提供了sizeDelta屬性可以用來(lái)動(dòng)態(tài)修改RectTransform的大小,但同時(shí)我們也google到另外一個(gè)修改RectTransform大小的方法辉浦,方法如下:

    public static void SetRectTransformSize(RectTransform trans, Vector2 newSize)
    {
        Vector2 oldSize = trans.rect.size;
        Vector2 deltaSize = newSize - oldSize;
        trans.offsetMin = trans.offsetMin - new Vector2(deltaSize.x * trans.pivot.x, deltaSize.y * trans.pivot.y);
        trans.offsetMax = trans.offsetMax + new Vector2(deltaSize.x * (1f - trans.pivot.x), deltaSize.y * (1f - trans.pivot.y));
    }

那RectTransform.sizeDelta和這個(gè)自定義的SetRectTransformSize有沒(méi)有差別?差別在哪兒茎辐?我們做了下實(shí)驗(yàn)來(lái)測(cè)試:
新建一個(gè)場(chǎng)景盏浙,放入四個(gè)按鈕


image.png

其中deltaSize和resize按鈕的Anchors四個(gè)點(diǎn)重合,deltaSizeWithCustomAnc和resizeWithCustomAnc按鈕的四個(gè)點(diǎn)不重合


image.png
image.png

然后掛載一個(gè)腳本荔茬,在點(diǎn)擊change按鈕的時(shí)候修改上邊四個(gè)按鈕的大小:

using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public class ResizeTestController : MonoBehaviour {

    public RectTransform deltaSizeBtn;
    public RectTransform resizeBtn;
    public RectTransform deltaSizeDiffAncBtn;
    public RectTransform resizeDiffAncBtn;

    Vector2 newSize =new Vector2(300f,50f);

    public void Change(){
        //Anchors在同一點(diǎn)的button
        deltaSizeBtn.sizeDelta = newSize;
        U3DUtils.SetRectTransformSize(resizeBtn, newSize);

        //Anchors不在同一點(diǎn)的button
        deltaSizeDiffAncBtn.sizeDelta = newSize;
        U3DUtils.SetRectTransformSize(resizeDiffAncBtn, newSize);
    }
}

點(diǎn)擊Change按鈕后:


image.png

我們可以看到按鈕deltaSizeWithCustomAnc的大小與眾不同竹海,說(shuō)明sizeDelta屬性的計(jì)算過(guò)程跟SetRectTransformSize是不一樣的严里,Unity官方文檔對(duì)sizeDelta的說(shuō)明:
RectTransform sizeDelta
大概意思是Anchors在同一點(diǎn)的時(shí)候捷绑,sizeDelta相當(dāng)于設(shè)置長(zhǎng)寬,但是Anchors不在同一點(diǎn)時(shí),表示的只是比Anchors矩形大或者小多少藤韵。

那么sizeDelta具體又是怎么轉(zhuǎn)換到trans.offsetMin和trans.offsetMax的呢?


image.png

如上圖抚官,left + right剛好是我們?cè)O(shè)置的300的-1倍:-300, top + bottom也是剛好-50(負(fù)數(shù)的意思是比Anchors矩形大猜旬;正數(shù)就是Anchors矩形內(nèi),就是比Anchros矩形兴ψ俊)鸠匀。
那可以猜測(cè)(看源代碼沒(méi)找到sizeDelta最終計(jì)算的地方,??)sizeDelta的計(jì)算方法是與anchors有關(guān)的逾柿,當(dāng)然還與Pivot有關(guān)(可以自己測(cè)試下看看)缀棍,寫個(gè)模擬方法來(lái)驗(yàn)證下:

    public static void SetRectTransformDeltaSize(RectTransform trans, Vector2 newSize)
    {
        var x = -newSize.x - trans.offsetMin.x + trans.offsetMax.x;
        var y = -newSize.y - trans.offsetMin.y + trans.offsetMax.y;

        trans.offsetMin = new Vector2( trans.offsetMin.x + trans.pivot.x * x, trans.offsetMin.y + trans.pivot.y * y);
        trans.offsetMax = new Vector2( -(-trans.offsetMax.x + (1-trans.pivot.x) * x),-(-trans.offsetMax.y + (1-trans.pivot.y) * y));
    }

直接看可能不容易明白是什么意思,不過(guò)根據(jù)Unity的文檔我們知道sizeDelta表示的是RectTransformd對(duì)象矩形大小比Pivot矩形大或者小多少机错,那么RectTransform的Left和Right之和就等于sizeDelta.x的-1倍爬范,再考慮pivot,可以得到一個(gè)計(jì)算公式:

(Left + pivot.x *X) + (Right + (1-pivot.x) * X) =  - sizeDelta.x 

其中X是要求出的變量弱匪,轉(zhuǎn)換下公式就是:

X =  - sizeDelta.x - Left - Right

由于

Left == trans.offsetMin.x
Right == - trans.offsetMax.x

帶入后

X =  - sizeDelta.x - trans.offsetMin.x - (- trans.offsetMax.x)

那么新的Left就是
Left + pivot.x X
新的Right就是
Right + (1-pivot.x) * X
Right轉(zhuǎn)回offsetMax.xx需要
-1

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末青瀑,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子萧诫,更是在濱河造成了極大的恐慌斥难,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件财搁,死亡現(xiàn)場(chǎng)離奇詭異蘸炸,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)尖奔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門搭儒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)穷当,“玉大人,你說(shuō)我怎么就攤上這事淹禾∧俨耍” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵铃岔,是天一觀的道長(zhǎng)汪疮。 經(jīng)常有香客問(wèn)我,道長(zhǎng)毁习,這世上最難降的妖魔是什么智嚷? 我笑而不...
    開(kāi)封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮纺且,結(jié)果婚禮上盏道,老公的妹妹穿的比我還像新娘。我一直安慰自己载碌,他們只是感情好猜嘱,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著嫁艇,像睡著了一般朗伶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上步咪,一...
    開(kāi)封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天论皆,我揣著相機(jī)與錄音,去河邊找鬼猾漫。 笑死纯丸,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的静袖。 我是一名探鬼主播觉鼻,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼队橙!你這毒婦竟也來(lái)了坠陈?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤捐康,失蹤者是張志新(化名)和其女友劉穎仇矾,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體解总,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡贮匕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了花枫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片刻盐。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡掏膏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出敦锌,到底是詐尸還是另有隱情馒疹,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布乙墙,位于F島的核電站颖变,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏听想。R本人自食惡果不足惜腥刹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望汉买。 院中可真熱鬧肛走,春花似錦、人聲如沸录别。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)组题。三九已至,卻和暖如春抱冷,著一層夾襖步出監(jiān)牢的瞬間崔列,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工旺遮, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留赵讯,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓耿眉,卻偏偏與公主長(zhǎng)得像边翼,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鸣剪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容