当Scroll View.Content上的元素太多时, 将占用大量性能. 故只在Viewport可见区域创建和显示节点, 然后通过监听滑动事件动态计算行丶列数并修改节点属性:
实现原理简单, 此处仅提供C#版Vertical布局为参考
缺点:
- 只能通过代码调用和添加元素, 元素必需保持一致性
- 节点位置固定排版, 不能修改某个节点的位置
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
[XLua.LuaCallCSharp]
public class ScrollViewVertical : MonoBehaviour
{
//节点
public RectTransform m_Mask;
public RectTransform m_Content;
public RectTransform m_Item;
public ScrollRect m_ScrollRect;
//节点参数配置
private float spacingX, spacingY;
private float itemWidth, itemHeight;
//页面显示配置/页面上同时显示的节点
private int columnCount, rowCount;
private int showRowCount = 0; //从这一行开始显示
private List<Item> showItemList = new List<Item>();
//数据列表/只能通过Invoke.Method添加/数据委托
private List<object> dataList = new List<object>();
private Func<RectTransform, Action<object>> createItemCallback;
private void Start()
{
m_ScrollRect = m_ScrollRect ?? GetComponent<ScrollRect>();
m_ScrollRect.onValueChanged.AddListener((vec2) =>
{
int row = GetRow(m_Content.localPosition.y);
if (row >= 0 && row != showRowCount)