我們?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è)按鈕
其中deltaSize和resize按鈕的Anchors四個(gè)點(diǎn)重合,deltaSizeWithCustomAnc和resizeWithCustomAnc按鈕的四個(gè)點(diǎn)不重合
然后掛載一個(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按鈕后:
我們可以看到按鈕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的呢?
如上圖抚官,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