抽空做了一个UGUI的无限滚动的效果。只做了一半(向下无限滚动)。网上也看了很多教程,感觉还是按照自己的思路来写可能比较好。搭建如下:
content节点不添加任何组件。布局组件默认是会重新排版子节点的,所以如果子节点的位置变化,会重新排版,不能达到效果。Size Fitter组件也不加,自己写代码调整Size大小(不调整大小,无法滑动)。
最主要的实现过程就是用Queue来搬运Cell。在向下滚动的过程中(鼠标上滑),顶部滑出View Port的Cell被搬运到底部续上。这点类似于Queue的先见先出原则,再把Dequeue出来的元素添加到末尾,就很类似于ScrollView的无限滚动的原理了。在鼠标上滑的过程中,content的PosY值是一直增加的,所以触发滚动的条件就可以设定为位移之差大于Cell的高度值即可。
数据的刷新,数据到头之后,不能再次进行滚动轮换了,这里用一组值来记录初始化的一组Cell显示的是数据的哪一段。例如HeadNum和TaiNum。比如用20个Cell显示100条数据。初始化后,HeadNum就是0,TailNum就是19。上滑一行数据后,HeadNum=4,TailNum=23(这里假设是20个Cell排成4列)。
下面是完整代码:
public class UIScrollViewTest : MonoBehaviour {
public RectTransform content;
public GameObject cell;
// cell的初始化个数
public int cellAmount = 0;
// 鼠标上滑时,存储Cell的Queue。正序存储
public Queue F_cellQuee = new Queue();
// 鼠标下滑时,存储Cell的Queue。到序存储
public Queue B_cellQuee = new Queue();
// cell的Size
public Vector2 cellSize = new Vector2(100,100);
// cell的间隔
public Vector2 cellOffset = new Vector2(0,0);
// 列数
public int columnCount = 0;
private int rowCount;
// 上一次content的位置
public float lastPos;
// 滚动的次数
public int loopCount = 0;
// cell显示的数据段的开头和结尾序号
public int HeadNum = 0;
public int TailNum;
public Sprite[] sp;
public List<Sprite> data;
void Start()
{
for (int i = 0; i < sp.Length; i++)
{