Unity中Scroll View的自动滚动与拖拽回正

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;
    }

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值