RectTransform实现了分辨率适配,我分析了一下这个机制,并试着做出相应的推导这个过程,而推导过程,就是根据面板显示的这些数据,计算控件的四个顶点位置。
可以观察,拖动Anchor的时候,会出现如图所示红线标注的一个矩形,我们称这个矩形是RC1,最终控件的四个顶点,
就是这个矩形,通过后续的旋转和缩放得来的。
我们设父控件大小为ParentSize,容易得到RC1:
RC1.minX = ParentSize.width * Anchor.minX + Left
RC1.maxX = ParentSize.width * Anchor.maxX - Right;
RC1.minY = ParentSize.height * Anchor.minY + Bottom;
RC1.maxY = ParentSize.height * Anchor.maxY - Top;
从而得到控件的Size:
Size.width = RC1.maxX - RC1.minX;
Size.height = RC1.maxY - RC2.minY;
于是算得重心位置:
CenterX = RC1.minX + Size.width * Pivot.x;
CenterY = RC1.minY + Size.height * pivot.y;
于是我们得到控件局部坐标系下四个顶点的坐标:
v1 = (-Size.x * Pivot.x, -Size.y * Pivot.y);
v2 = (Size.x * (1-Pivot.x), -Size.y * Pivot.y);
v3 = (Size.x * (1-Pivot.x), Size.y * (1-Pivot.y));
v4 = ((-Size.x * Pivot.x, Size.y * (1-Pivot.y));
好了原始的顶点终于算出来了,之后就该进行局部的旋转以及缩放变换了,变换后的顶点为:
v' = v * R * S;
下一步就是进行平移变换,平移多少?就是Center构成的平移矩阵啊!
完成!