public void moveToIndex(int dataIndex, bool imediate) { if (mDataProviders.Count <= dataIndex) { return; } DynamicInfinityItem fisrtitem = null;//= itemList[0].itemIndex; for (int i = 0; i < itemList.Count; i++) { if (itemList[i].transform.localPosition.y <= 0) { fisrtitem = itemList[i]; break; } } if (fisrtitem != null && fisrtitem.itemIndex >= dataIndex) { // if(itemList[0].transform.localPosition.y >= 0) { StartCoroutine(scrollToIndex(dataIndex, -1, imediate)); } } else { StartCoroutine(scrollToIndex(dataIndex, 1, imediate)); } }
void OnSelectHandler(DynamicInfinityItem item) { print("on select " + item.ToString()); m_SelectedData = (int)item.GetData(); m_LoopList.GetDataProvider().Remove(m_SelectedData); m_LoopList.RefreshDataProvider(); }
/// <summary> /// 清理可复用渲染格 /// 不需要public /// </summary> void ClearAllListRenderDr() { if (mList_items != null) { int len = mList_items.Count; for (int i = 0; i < len; ++i) { DynamicInfinityItem item = mList_items[i]; item.DRect = null; } } }
/// <summary> /// 获得待渲染的渲染器 /// </summary> /// <returns></returns> DynamicInfinityItem GetNullDynmicItem() { int len = mList_items.Count; for (int i = 0; i < len; ++i) { DynamicInfinityItem item = mList_items[i]; if (item.DRect == null) { return(item); } } throw new Exception("Error"); }
/// <summary> /// 通过动态格子获得动态渲染器 /// </summary> /// <param name="rect"></param> /// <returns></returns> DynamicInfinityItem GetDynmicItem(DynamicRect rect) { int len = mList_items.Count; for (int i = 0; i < len; ++i) { DynamicInfinityItem item = mList_items[i]; if (item.DRect == null) { continue; } if (rect.Index == item.DRect.Index) { return(item); } } return(null); }
protected void UpdateRender() { //先算mask,保证遮罩 mRectMask.y = -mMaskSize.y - mRectTransformContainer.anchoredPosition.y; Dictionary <int, DynamicRect> inOverlaps = new Dictionary <int, DynamicRect>(); //这里foreach是否开销很大,改成别的方式 foreach (DynamicRect dR in mDict_dRect.Values) { if (dR.Overlaps(mRectMask))//计算是否在mask中 { inOverlaps.Add(dR.Index, dR); } } int len = mList_items.Count; for (int i = 0; i < len; ++i) { DynamicInfinityItem 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)//如果没有获取到就重新生成一个 { Debug.Log("mList_items相当于一个对象池,通过每个子元素中的DRect==null来判断是否使用"); DynamicInfinityItem item = GetNullDynmicItem();//从对象池里面获取一个 item.DRect = dR; _UpdateChildTransformPos(item.gameObject, dR.Index); if (mDataProviders != null && dR.Index < mDataProviders.Count) { item.SetData(mDataProviders[dR.Index]); } } } }
/// <summary> /// 初始化渲染脚本 /// </summary> public virtual void InitRendererList(DynamicInfinityItem.OnSelect OnSelect, DynamicInfinityItem.OnUpdateData OnUpdate) { if (mHasInited) { return; } //转换器 mRectTransformContainer = transform as RectTransform; //获得蒙版尺寸 mMaskSize = transform.parent.parent.GetComponent <RectTransform>().sizeDelta; mScrollRect = transform.parent.parent.GetComponent <ScrollRect>(); transform.GetComponent <RectTransform>().sizeDelta = Vector2.zero; //通过蒙版尺寸和格子尺寸计算需要的渲染器个数 mRendererCount = ColumnCount * (Mathf.CeilToInt(mMaskSize.y / GetBlockSizeY()) + 1); _UpdateDynmicRects(mRendererCount); mList_items = new List <DynamicInfinityItem>(); 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; DynamicInfinityItem dfItem = child.GetComponent <DynamicInfinityItem>(); 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) { DynamicInfinityItem 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) { DynamicInfinityItem item = GetNullDynmicItem(); item.DRect = dR; _UpdateChildTransformPos(item.gameObject, dR.Index); if (mDataProviders != null && dR.Index < mDataProviders.Count) { item.SetData(mDataProviders[dR.Index]); } } } }
void OnSelectHandler(DynamicInfinityItem item) { print("on select " + item.ToString()); }
void OnSelectHandler(DynamicInfinityItem item) { Tips.Instance.OnSuccess(item.ToString()); }
private void moveItemPos(float dist) { for (int i = 0; i < itemList.Count; i++) { Vector3 lpos = itemList[i].transform.localPosition; itemList[i].transform.localPosition = new Vector3(lpos.x, lpos.y + dist, 0); } for (int i = 0; i < itemList.Count; i++) { Vector3 lpos = itemList[i].transform.localPosition; float heightitem = itemList[i].itemHeight; if (dist >= 0 && lpos.y > heightitem && itemList[itemList.Count - 1].itemIndex < mDataProviders.Count - 1) { DynamicInfinityItem rd = itemList[i]; rd.itemIndex = itemList[itemList.Count - 1].itemIndex + 1; int row = Mathf.FloorToInt(rd.itemIndex / columeCount); int row1 = Mathf.FloorToInt((rd.itemIndex - 1) / columeCount); if (row > row1) { lpos.y = itemList[itemList.Count - 1].transform.localPosition.y - itemList[itemList.Count - 1].itemHeight - spaceSize.y; } else { lpos.y = itemList[itemList.Count - 1].transform.localPosition.y; } itemList[i].transform.localPosition = lpos; rd.SetData(mDataProviders[rd.itemIndex]); //Debug.Log("data index:" + rd.itemIndex); itemList.RemoveAt(i); itemList.Add(rd); i--; } else if (dist < 0 && lpos.y < -viewheight && itemList[0].itemIndex > 0) { DynamicInfinityItem rd = itemList[i]; rd.itemIndex = itemList[0].itemIndex - 1; int row = Mathf.FloorToInt(rd.itemIndex / columeCount); int row1 = Mathf.FloorToInt((rd.itemIndex + 1) / columeCount); if (row < row1) { lpos.y = itemList[0].transform.localPosition.y + itemList[i].itemHeight + spaceSize.y; } else { lpos.y = itemList[0].transform.localPosition.y; } int column = rd.itemIndex % columeCount; lpos.x = (minCellSize.x + spaceSize.x) * column; itemList[i].transform.localPosition = lpos; rd.SetData(mDataProviders[rd.itemIndex]); itemList.RemoveAt(i); itemList.Insert(0, rd); } } //updateItemPos(); }
void OnUpdateHandler(DynamicInfinityItem item) { print("on upadte " + item.ToString()); }