【问题标题】:How to make a ScrollRect content scroll indefinitely?如何使 ScrollRect 内容无限滚动?
【发布时间】:2017-07-25 13:59:23
【问题描述】:

我目前正在做一个小项目来学习 Unity,但我一直在做一个无限滚动的 ScrollRect。我得到了从掩码中生成/回收对象的想法,并添加正确的操作并注册,并根据内容面板的移动方向将新的操作设置为内容面板的最后一个或第一个兄弟,但是有是一个小问题。当我在那个内容面板上有 100 多个对象时,不能指望我把内容面板做得很长,这样我就可以滚动很长时间。我需要的是无限滚动一个小的(仍然大于掩码)面板。我该怎么做?

我目前正在使用 normalizedPosition,并滚动回面板顶部(或底部,根据我前进的方向),这就是我的 OnDrag 方法的样子;

public void OnDrag(PointerEventData eventData)
{
    if (transform.GetComponent<ScrollRect>().verticalNormalizedPosition < 0.15f)
    {
        transform.GetComponent<ScrollRect>().verticalNormalizedPosition = 0.88f;
    }
    if (transform.GetComponent<ScrollRect>().verticalNormalizedPosition > 0.90f)
    {
        transform.GetComponent<ScrollRect>().verticalNormalizedPosition = 0.17f;
    }
}

顺便说一下,如果需要任何相关信息,我的班级正在实施 IDragHandler。

【问题讨论】:

  • 如果滚动速度非常快并且从 0.89 的垂直位置转到 0.99 怎么办?你不应该把它硬拉到 0.17,你应该加或减一个值。
  • 我不滚动,而是只让拖动工作。我已经实现了 IScrollHandler 以“吞噬”该动作。拖拽的时候,没看懂你说的“加”是什么意思,但是我会尝试在垂直归一化位置为0.99的时候加0.02,希望能回滚。

标签: c# user-interface unity3d


【解决方案1】:

在查看了我在互联网上找到的一些示例后,我决定将内容面板移动类型设置为“无限制”,从而使面板按我的意愿滚动​​。我正在手动放置按钮,内容的子项。这里和那里都有一些小的数学问题,当调整高度时,新按钮的形成有点奇怪,但我仍然实现了无限滚动效果。

public void OnDrag(PointerEventData eventData)
{
    _yMargin = ScrollContent.transform.position.y - _dragStart;
    Debug.Log(_yMargin);
    //todo: howmanybuttons shows how many lines should be filled. Take sign to determine way, take number to determine line no.
    int howManyLevels = Mathf.Abs((int)(_yMargin / _buttonHeight) / 2);
    Debug.Log(howManyLevels);
    if (Mathf.Sign(_yMargin).Equals(1))
    {
        for (int i = 0; i < howManyLevels; i++)
        {
            _dragStart += _buttonHeight;
            _upCount += 2;
            PanObjectPoolManager.Recycle(ScrollContent.transform.GetChild(0));
            PanObjectPoolManager.Recycle(ScrollContent.transform.GetChild(0));
            _button = PanObjectPoolManager.Spawn(ButtonObject, ScrollContent.transform);
            _button.transform.GetChild(0).GetComponent<Text>().text = _downCount + "";
            BuildOnCoords(_downlevel, true);
            if (_downCount == 99)
                _downCount = -1;
            _downCount++;
            _button = PanObjectPoolManager.Spawn(ButtonObject, ScrollContent.transform);
            _button.transform.GetChild(0).GetComponent<Text>().text = _downCount + "";
            BuildOnCoords(_downlevel, false);
            if (_downCount > 99)
                _downCount = 0;
            _downCount++;
            _downlevel++;
            _uplevel++;
        }
    }
    if (Mathf.Sign(_yMargin).Equals(-1))
    {
        for (int i = 0; i < howManyLevels; i++)
        {
            _dragStart -= _buttonHeight;
            _downCount -= 2;
            PanObjectPoolManager.Recycle(ScrollContent.transform.GetChild(_childCount - 2));
            PanObjectPoolManager.Recycle(ScrollContent.transform.GetChild(_childCount - 2));
                _button = PanObjectPoolManager.Spawn(ButtonObject, ScrollContent.transform);
            _button.transform.GetChild(0).GetComponent<Text>().text = _upCount + "";
            _button.transform.SetSiblingIndex(0);
            BuildOnCoords(_uplevel, false);
            if (_upCount < 0)
                _upCount = 99;
            _upCount--;
            _button = PanObjectPoolManager.Spawn(ButtonObject, ScrollContent.transform);
            _button.transform.GetChild(0).GetComponent<Text>().text = _upCount + "";
            _button.transform.SetSiblingIndex(0);
            BuildOnCoords(_uplevel, true);
            if (_upCount == 0)
                _upCount = 100;
            _upCount--;
            _uplevel--;
            _downlevel--;
        }
    }
}

【讨论】:

    猜你喜欢
    • 2012-10-31
    • 2023-02-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-09
    • 2020-01-22
    • 1970-01-01
    • 2021-10-15
    • 1970-01-01
    相关资源
    最近更新 更多