2020.7.15 初学Scroll View仅供参考
ScrollView的创建与设置
创建一个ScrollView,想水平滚动需要将ScrollView中ScrollRect组件下的Vertical取消勾选,即只允许水平方向滚动,不允许竖直方向滚动
在Content中加入Grid Layout Group(管理Content子游戏物体)与Content Size Fitter组件。要让Content下子物体呈一行排列,设置如下
调整Cell Size的X与Y,让子物体占满Content。
设置Content水平方向为最合适的尺寸
自动滚动代码实现
初始化组件
RectTransform content;
ScrollRect rect;
void Start()
{
rect = transform.GetComponent<ScrollRect>();
content = transform.Find("Viewport/Content").GetComponent<RectTransform>();
}
在ScrollRect中,未曾滚动时,rect.horizontalNormalizedPosition为0,滚动到头时值为1。
所以如果共有三页,滚动到第二页时则为0.5;
四页阈值则为0 0.3 0.6 1.
保存每页阈值
m_pages = new float[m_pageCount];
for (int i = 0; i < m_pages.Length; i++)
{
m_pages[i] = i * (1 / (float)(m_pageCount - 1));
}
计时滑动
void Update()
{
m_timer += Time.deltaTime * (1 / m_moveTime);
rect.horizontalNormalizedPosition = Mathf.Lerp(m_startMovePos, m_pages[m_currentPages], m_timer);
if (m_timer >= 1)
{
m_isMoving = false;
}
}
监听自动滚动
public void ListenerAutoScroll()
{
if (m_isDraging)
{
return;
}
if (m_isAutoScroll)
{
m_AutoScrollTimer += Time.deltaTime;
if (m_AutoScrollTimer >= m_AutoScrollTime)
{
m_AutoScrollTimer = 0;
m_currentPages++;
//滚动到最后一页时,返回到第一页
m_currentPages %= m_pageCount;
ScrollToPages(m_currentPages);
}
}
}
void ScrollToPages(int page)
{
m_isMoving = true;
this.m_currentPages = page;
m_timer = 0;
switch (scrollType)
{
case ScrollType.Horizontal: //当前位置为下一次开始位置
m_startMovePos = rect.horizontalNormalizedPosition;
break;
case ScrollType.Vertical:
m_startMovePos = rect.verticalNormalizedPosition;
break;
default:
break;
}
}
如何计算当前位置离哪一阈值最近
int CaculateMinDistancePage()
{
int minPage = 0;
for (int i = 1; i < m_pages.Length; i++)
{
switch (scrollType)
{
case ScrollType.Horizontal:
//如果四页,i=1时,当前位置0.1时,|0.3-0.1| < |0 - 0.1| => false => return minPage = 0;
//如果四页,i=1时,当前位置0.2时,|0.3-0.2| < |0 - 0.2| => true =>
//return minPage = i = 1;
//返回值被ScrollToPages调用
if (Mathf.Abs(m_pages[i] - rect.horizontalNormalizedPosition) <
Mathf.Abs(m_pages[minPage] - rect.horizontalNormalizedPosition))
{
minPage = i;
}
break;
case ScrollType.Vertical:
if (Mathf.Abs(m_pages[i] - rect.verticalNormalizedPosition) <
Mathf.Abs(m_pages[minPage] - rect.verticalNormalizedPosition))
{
minPage = i;
}
break;
default:
break;
}
}
return minPage;
}