/// <summary>
 /// 清理可复用渲染格
 /// 不需要public
 /// </summary>
 void ClearAllListRenderDr()
 {
     if (mList_items != null)
     {
         int len = mList_items.Count;
         for (int i = 0; i < len; ++i)
         {
             VirtualListItem item = mList_items[i];
             item.DRect = null;
         }
     }
 }
        /// <summary>
        /// 获得待渲染的渲染器
        /// </summary>
        /// <returns></returns>
        VirtualListItem GetNullDynmicItem()
        {
            int len = mList_items.Count;

            for (int i = 0; i < len; ++i)
            {
                VirtualListItem item = mList_items[i];
                if (item.DRect == null)
                {
                    return(item);
                }
            }
            throw new Exception("Error");
        }
示例#3
0
    private void CalculatePosistion(VirtualListItem item)
    {
        float tempPosY = deltaPos.y + item.transform.localPosition.y;


        Vector3 tempPos = item.transform.localPosition;

        item.transform.localPosition = new Vector3(item.transform.localPosition.x, tempPosY, item.transform.localPosition.z);
        if (tempPosY < LastPos.y * 1.5)
        {
            if (HasEdge && virtualListItems.First.Value.Data.CurIndex - 1 < 0)
            {
                return;
            }
            int index = virtualListItems.First.Value.Data.CurIndex - 1;
            if (index < 0)
            {
                index += DataList.Count;
            }
            LinkedListNode <VirtualListItem> tempNode = virtualListItems.Last;
            tempNode.Value.transform.localPosition = new Vector3(virtualListItems.First.Value.transform.localPosition.x,
                                                                 virtualListItems.First.Value.transform.localPosition.y + item.SizeY,
                                                                 virtualListItems.First.Value.transform.localPosition.z);
            virtualListItems.RemoveLast();
            tempNode.Value.BindData(DataList[index]);
            virtualListItems.AddFirst(tempNode);
        }

        if (tempPosY > TopPos.y * 1.5)
        {
            if (HasEdge && virtualListItems.Last.Value.Data.CurIndex + 1 > DataList.Count - 1)
            {
                return;
            }
            int index = virtualListItems.Last.Value.Data.CurIndex + 1;
            if (index > DataList.Count - 1)
            {
                index = index - (DataList.Count);
            }

            LinkedListNode <VirtualListItem> tempNode = virtualListItems.First;
            tempNode.Value.transform.position = new Vector3(virtualListItems.Last.Value.transform.position.x,
                                                            virtualListItems.Last.Value.transform.position.y - item.SizeY,
                                                            virtualListItems.Last.Value.transform.position.z);
            virtualListItems.RemoveFirst();
            tempNode.Value.BindData(DataList[index]);
            virtualListItems.AddLast(tempNode);
        }
    }
        /// <summary>
        /// 通过动态格子获得动态渲染器
        /// </summary>
        /// <param name="rect"></param>
        /// <returns></returns>
        VirtualListItem GetDynmicItem(DynamicRect rect)
        {
            int len = mList_items.Count;

            for (int i = 0; i < len; ++i)
            {
                VirtualListItem item = mList_items[i];
                if (item.DRect == null)
                {
                    continue;
                }
                if (rect.Index == item.DRect.Index)
                {
                    return(item);
                }
            }
            return(null);
        }
示例#5
0
 public void Start()
 {
     curCenterPos.y += Content.rect.height / 2;
     LastPos.y       = -200;
     Debug.Log(LastPos.y);
     originCenterPos.y = Content.rect.height / 2;
     VirtualRow        = CanViewNum + 1;
     TopPos.y          = 200;
     virtualListItems  = new LinkedList <VirtualListItem>();
     InitData();
     for (int i = 0; i < VirtualRow; i++)
     {
         VirtualListItem temp = MonoBehaviour.Instantiate(ListItemPrefab, Content).GetComponent <VirtualListItem>();
         virtualListItems.AddLast(temp);
         temp.Init(this);
         temp.SetIndex(i, 1);
         temp.BindData(DataList[i]);
     }
 }
 /// <summary>
 /// 初始化渲染脚本
 /// </summary>
 public virtual void InitRendererList(VirtualListItem.OnSelect OnSelect, VirtualListItem.OnUpdateData OnUpdate)
 {
     if (mHasInited)
     {
         return;
     }
     //转换器
     mRectTransformContainer = transform as RectTransform;
     //获得蒙版尺寸
     mMaskSize   = transform.parent.GetComponent <RectTransform>().sizeDelta;
     mScrollRect = transform.parent.GetComponent <ScrollRect>();
     //通过蒙版尺寸和格子尺寸计算需要的渲染器个数
     mRendererCount = ColumnCount * (Mathf.CeilToInt(mMaskSize.y / GetBlockSizeY()) + 1);
     _UpdateDynmicRects(mRendererCount);
     mList_items = new List <VirtualListItem>();
     for (int i = 0; i < mRendererCount; ++i)
     {
         GameObject child = GameObject.Instantiate(RenderGO);
         child.transform.SetParent(transform);
         child.transform.localRotation = Quaternion.identity;
         child.transform.localScale    = Vector3.one;
         child.layer = gameObject.layer;
         VirtualListItem dfItem = child.GetComponent <VirtualListItem>();
         if (dfItem == null)
         {
             throw new Exception("Render must extend DynamicInfinityItem");
         }
         mList_items.Add(dfItem);
         mList_items[i].DRect               = mDict_dRect[i];
         mList_items[i].OnSelectHandler     = OnSelect;
         mList_items[i].OnUpdateDataHandler = OnUpdate;
         child.SetActive(false);
         _UpdateChildTransformPos(child, i);
     }
     _SetListRenderSize(mRendererCount);
     mHasInited = true;
 }
        protected void UpdateRender()
        {
            mRectMask.y = -mMaskSize.y - mRectTransformContainer.anchoredPosition.y;
            Dictionary <int, DynamicRect> inOverlaps = new Dictionary <int, DynamicRect>();

            foreach (DynamicRect dR in mDict_dRect.Values)
            {
                if (dR.Overlaps(mRectMask))
                {
                    inOverlaps.Add(dR.Index, dR);
                }
            }
            int len = mList_items.Count;

            for (int i = 0; i < len; ++i)
            {
                VirtualListItem item = mList_items[i];
                if (item.DRect != null && !inOverlaps.ContainsKey(item.DRect.Index))
                {
                    item.DRect = null;
                }
            }
            foreach (DynamicRect dR in inOverlaps.Values)
            {
                if (GetDynmicItem(dR) == null)
                {
                    VirtualListItem item = GetNullDynmicItem();
                    item.DRect = dR;
                    _UpdateChildTransformPos(item.gameObject, dR.Index);

                    if (mDataProviders != null && dR.Index < mDataProviders.Count)
                    {
                        item.SetData(mDataProviders[dR.Index]);
                    }
                }
            }
        }