1、效果展示
2、主要代码
/// <summary>
/// 定位目标 到视口中心
/// </summary>
public void MoveToViewCenter(ScrollRect scrollRect, RectTransform itemTrans)
{
// 获取目标RectTransform和viewport的局部坐标边界
Vector3[] itemCornersArray = new Vector3[4];
itemTrans.GetWorldCorners(itemCornersArray);
Vector3[] viewportCornersArray = new Vector3[4];
scrollRect.viewport.GetWorldCorners(viewportCornersArray);
// 转换世界坐标到内容局部坐标
for (int i = 0; i < 4; i++)
{
itemCornersArray[i] = scrollRect.content.InverseTransformPoint(itemCornersArray[i]);
viewportCornersArray[i] = scrollRect.content.InverseTransformPoint(viewportCornersArray[i]);
}
// 获取目标和视口的中心点
Vector2 itemCenter = (itemCornersArray[0] + itemCornersArray[2]) / 2;
Vector2 viewportCenter = (viewportCornersArray[0] + viewportCornersArray[2]) / 2;
Vector2 contentPosition = scrollRect.content.anchoredPosition;
// 计算目标元素中心与视口中心的差值
Vector2 offset = viewportCenter - itemCenter;
// 更新内容位置
contentPosition += offset;
scrollRect.content.anchoredPosition = contentPosition;
}