首页信息安全UGUI实现ScrollView无限滚动效果

UGUI实现ScrollView无限滚动效果

admin 11-12 10:42 400次浏览

抽空做了一个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 data;
 
 
 void Start()
 {
  for (int i = 0; i >3));
 }
 
 
 void Update()
 {
  // 触发滚动。
  if (content.localPosition.y - lastPos > cellSize.y && data.Count - cellAmount - loopCount*columnCount >0)
  {
   //Debug.LogError("11111111111 " + (data.Count - cellAmount - loopCount * columnCount));
   LoopScrolView(data);
   lastPos = content.localPosition.y;
  }
 }
 
 
 
 
 // 初始化cell
 void InitialScrollView(List data)
 {
  for (int i = 0; i = 0; i--)
  {
   B_cellQuee.Enqueue(content.GetChild(i).gameObject);
  }
  for (int i = 0; i 0)
  {
   rowCount = cellAmount / columnCount + 1;
  } else {
   rowCount = 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 data;
 
 
 void Start()
 {
  for (int i = 0; i >3));
 }
 
 
 void Update()
 {
  // 触发滚动。
  if (content.localPosition.y - lastPos > cellSize.y && data.Count - cellAmount - loopCount*columnCount >0)
  {
   //Debug.LogError("11111111111 " + (data.Count - cellAmount - loopCount * columnCount));
   LoopScrolView(data);
   lastPos = content.localPosition.y;
  }
 }
 
 
 
 
 // 初始化cell
 void InitialScrollView(List data)
 {
  for (int i = 0; i = 0; i--)
  {
   B_cellQuee.Enqueue(content.GetChild(i).gameObject);
  }
  for (int i = 0; i 0)
  {
   rowCount = cellAmount / columnCount + 1;
  } else {
   rowCount = cellAmount / columnCount;
  }
 
  // 排列cell的位置
  int index = 0;
  for (int r = 1; r 
UGUI实现ScrollView无限滚动效果
复制镜像 云主机 UHost [LeetCode][Java] Gas Station
相关内容