/// <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"); }
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); }
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]); } } } }