前言
上一篇文章分享了UGUI中RectTransform的基本使用方式,这篇来补下“实现方式”。
一、Anchor是什么意思?
官网定义:The anchor points for the lower left corner and the upper right corner of the rectangle。
anchor表示父节点被对齐的边界,这个边界就可以用矩形来描述。
anchor有两个数据:min和max。分别代表这个矩形的左下角和右上角。
这个值不像pivot,你可以设置很大的值,只可以是0-1。相对应地,表示自身的百分比。
示例:例如左下角就是(0,0)。右上角就是(0,1)。(0.5,0.5)就表示中间了。
会找到这个边界,再根据偏移值进行偏移。
相对应地,就是子节点的左下角对父节点min进行偏移,子节点的右上角对齐父节点的max
二、实现原理
对于开发者来说,似乎有两种对齐的思路。难道内部也需要保存两套数据么?来看看内部保存的数据。
1.属性
我们把Inspector设为Debug模式,可以看到。没有宽高,也没有top、bottom、left、right。取而代之的是sizeDelta。那搞懂这个变量有什么用就是关键了。
这是网上的RectTransform属性
2.数学原理
根据上面的定义
父节点max指向子节点max为offsetMax
=> offsetMax = rectMax - anchorMax
同理,父节点minx指向子节点min为offsetMin
=> offsetMin = rectMin - anchorMin
而sizeDelta = offsetMax - offsetMin
推导一下:
offsetMax - offsetMin = (rectMax - anchorMax) - (rectMin - anchorMin)
= (rectMax - rectMin ) - (anchorMax- anchorMin)
= 子节点左下角指向右上角 - 父节点min指向max
= 子节点尺寸 - anchor尺寸
那么,当我们对齐的中心点为一个点(例如父节点的中心),那么sizeDelta就等于子节点自身的宽高。
其实直接记结论就可以了。
这篇文章写得比我好,虽然可能不是原作者: 链接.
3.接口介绍
SetSizeWithCurrentAnchors(axis, size)
// 单独设置某个方向上的尺寸信息,axis表示水平或垂直。不会影响anchor信息
SetInsetAndSizeFromParentEdge(edge, inset, size)
// edge表示top\bottom\left\right,对应哪条边
// inset表示距离
// size表示当前边的尺寸
// 会修改anchor信息,单更容易得到想要的结果
小结
简单说了下内部保存的属性,没有详细讲。
小tips:如果我们想设置不同父节点下子节点的位置,而用position又出现问题的时候。不妨试一下anchoredPosition,很多问题就解决了。