void OnInitItem(LoopItemObject item, LoopItemData data) { chatItemData myData = data as chatItemData; chatItem itemComp = item.widget.GetComponent <chatItem>(); itemComp.showItemByType(myData.ItemType); switch (myData.ItemType) { case 1: itemComp.selfContent.text = myData.content; itemComp.selfUserNameLabel.text = myData.username; break; case 2: itemComp.otherContent.text = myData.content; itemComp.ohterUserNameLabel.text = myData.username; GameObject go = itemComp.transform.FindChild("otherChatItem/headImgBg/headImg").gameObject; //go.name = "headImg" + myData.uid; UIEventListener.Get(go).onClick = (g) => { print(myData.uid); }; break; case 3: itemComp.timeLable.text = myData.content; break; } }
/// <summary> /// 设回初始状态 /// </summary> /// <param name="isResetPos">是否重置位置</param> public void ResetToBegining(bool isResetPos = true) { //itemLoop = new Queue<LoopItemObject>(); if (itemsList != null) { for (int i = 0; i < itemsList.Count; i++) { if (!itemLoop.Contains(itemsList[i])) { itemsList[i].widget.gameObject.name = "0"; itemsList[i].widget.gameObject.SetActive(false); PutItemToLoop(itemsList[i]); } } } if (firstItem != null) { tempFirstItem = isResetPos ? -1 : firstItem.dataIndex; } lastItem = null; firstItem = null; itemsList = null; if (isResetPos) { scrollView.ResetPosition(); } }
void InitItemDontReset(LoopItemObject item, int dataIndex, LoopItemData data) { //UnityEngine.Debug.Log("bbbbbbbbbbbbbbbbbb " + dataIndex); item.dataIndex = dataIndex; if (OnItemInit != null) { OnItemInit(item, data); } if (scrollView.movement == UIScrollView.Movement.Vertical) { float offsetY = (item.widget.height + gapDis) * dataIndex; if (arrangeDirection == ArrangeDirection.Down_to_Up) { offsetY *= -1f; } item.widget.transform.localPosition = itemStartPos - new Vector3(0, offsetY, 0); } else { float offsetX = (item.widget.width + gapDis) * dataIndex; if (arrangeDirection == ArrangeDirection.Right_to_Left) { offsetX *= -1f; } item.widget.transform.localPosition = itemStartPos + new Vector3(offsetX, 0, 0); } }
/// <summary> /// 构造一个 item 对象 /// </summary> /// <returns>The item.</returns> LoopItemObject CreateItem() { GameObject go = NGUITools.AddChild(itemParent, itemPrefab); UIWidget widget = go.GetComponent <UIWidget>(); LoopItemObject item = go.GetComponent <LoopItemObject>();//new LoopItemObject(); item.widget = widget; go.SetActive(true); return(item); }
/// <summary> /// 用数据列表来初始化scrollview /// </summary> /// <param name="item">Item.</param> /// <param name="indexData">Index data.</param> /// <param name="data">Data.</param> void InitItem(LoopItemObject item, int dataIndex, LoopItemData data) { item.dataIndex = dataIndex; // print(item.gameObject.name); if (OnItemInit != null) { OnItemInit(item, data); } item.widget.transform.localPosition = itemStartPos; }
/// <summary> /// 将要移除的item放入对象池中 /// --这个里我保证这个对象池中存在的对象不超过3个 /// </summary> /// <param name="item">Item.</param> void PutItemToLoop(LoopItemObject item) { if (itemLoop.Count >= 3) { Destroy(item.widget.gameObject); return; } item.dataIndex = -1; item.widget.gameObject.SetActive(false); itemLoop.Enqueue(item); }
void OnItemInit(LoopItemObject item, LoopItemData data) { chatItemData myData = data as chatItemData; chatItem itemComp = item.widget.GetComponent <chatItem>(); itemComp.showItemByType(myData.ItemType); itemComp.otherContent.text = myData.content; itemComp.selfContent.text = myData.content; itemComp.timeLable.text = myData.content; item.gameObject.name = "Item" + item.dataIndex; //item.widget.gameObject.SetActive(false); //print(myData.content +" " +item.widget.isVisible); }
/// <summary> /// 重置聊天记录 /// </summary> public void InitScollerView() { datasList = new List <LoopItemData>(); if (itemsList != null) { foreach (LoopItemObject v in itemsList) { PutItemToLoop(v);//全部放入释放池中 但最多储存3个 } itemsList = new List <LoopItemObject>(); } firstItem = null; lastItem = null; print("重置数据完成"); }
/// <summary> /// 将要移除的item放入对象池中 /// --这个里我保证这个对象池中存在的对象不超过RealShowCount个 /// </summary> /// <param name="item">Item</param> void PutItemToLoop(LoopItemObject item) { if (itemLoop.Count >= RealShowCount) { Destroy(item.widget.gameObject); return; } item.dataIndex = -1; item.widget.gameObject.SetActive(false); if (item.widget.GetComponent <UIToggle>() != null) { item.widget.GetComponent <UIToggle>().Set(false); } itemLoop.Enqueue(item); }
static int get_dataIndex(IntPtr L) { object o = null; try { o = ToLua.ToObject(L, 1); LoopItemObject obj = (LoopItemObject)o; int ret = obj.dataIndex; LuaDLL.lua_pushinteger(L, ret); return(1); } catch (Exception e) { return(LuaDLL.toluaL_exception(L, e, o == null ? "attempt to index dataIndex on a nil value" : e.Message)); } }
static int set_widget(IntPtr L) { object o = null; try { o = ToLua.ToObject(L, 1); LoopItemObject obj = (LoopItemObject)o; UIWidget arg0 = (UIWidget)ToLua.CheckUnityObject(L, 2, typeof(UIWidget)); obj.widget = arg0; return(0); } catch (Exception e) { return(LuaDLL.toluaL_exception(L, e, o == null ? "attempt to index widget on a nil value" : e.Message)); } }
static int set_dataIndex(IntPtr L) { object o = null; try { o = ToLua.ToObject(L, 1); LoopItemObject obj = (LoopItemObject)o; int arg0 = (int)LuaDLL.luaL_checknumber(L, 2); obj.dataIndex = arg0; return(0); } catch (Exception e) { return(LuaDLL.toluaL_exception(L, e, o == null ? "attempt to index dataIndex on a nil value" : e.Message)); } }
static int get_firstItem(IntPtr L) { object o = null; try { o = ToLua.ToObject(L, 1); LoopScrollView obj = (LoopScrollView)o; LoopItemObject ret = obj.firstItem; ToLua.PushObject(L, ret); return(1); } catch (Exception e) { return(LuaDLL.toluaL_exception(L, e, o, "attempt to index firstItem on a nil value")); } }
static int set_firstItem(IntPtr L) { object o = null; try { o = ToLua.ToObject(L, 1); LoopScrollView obj = (LoopScrollView)o; LoopItemObject arg0 = (LoopItemObject)ToLua.CheckObject <LoopItemObject>(L, 2); obj.firstItem = arg0; return(0); } catch (Exception e) { return(LuaDLL.toluaL_exception(L, e, o, "attempt to index firstItem on a nil value")); } }
static int get_lastItem(IntPtr L) { object o = null; try { o = ToLua.ToObject(L, 1); LoopItemScrollView obj = (LoopItemScrollView)o; LoopItemObject ret = obj.lastItem; ToLua.Push(L, ret); return(1); } catch (Exception e) { return(LuaDLL.toluaL_exception(L, e, o == null ? "attempt to index lastItem on a nil value" : e.Message)); } }
static int get_widget(IntPtr L) { object o = null; try { o = ToLua.ToObject(L, 1); LoopItemObject obj = (LoopItemObject)o; UIWidget ret = obj.widget; ToLua.Push(L, ret); return(1); } catch (Exception e) { return(LuaDLL.toluaL_exception(L, e, o == null ? "attempt to index widget on a nil value" : e.Message)); } }
static int set_lastItem(IntPtr L) { object o = null; try { o = ToLua.ToObject(L, 1); LoopItemScrollView obj = (LoopItemScrollView)o; LoopItemObject arg0 = (LoopItemObject)ToLua.CheckUnityObject(L, 2, typeof(LoopItemObject)); obj.lastItem = arg0; return(0); } catch (Exception e) { return(LuaDLL.toluaL_exception(L, e, o == null ? "attempt to index lastItem on a nil value" : e.Message)); } }
/// <summary> /// 用数据列表来初始化scrollview /// </summary> /// <param name="item">Item.</param> /// <param name="indexData">Index data.</param> /// <param name="data">Data.</param> void InitItem(LoopItemObject item, int dataIndex, LoopItemData data) { if (item == null) { return; } //UnityEngine.Debug.Log("aaaaaaaaaaaaaaaa " + dataIndex); item.dataIndex = dataIndex; if (OnItemInit != null) { OnItemInit(item, data); } if (item.widget != null) { item.widget.transform.localPosition = itemStartPos; } }
LoopItemObject GetBiggestDataIndexItem() { LoopItemObject biggestItem = null; int biggestIndex = int.MinValue; if (itemsList != null) { foreach (LoopItemObject item in itemsList) { if (item.dataIndex > biggestIndex) { biggestIndex = item.dataIndex; biggestItem = item; } } } return(biggestItem); }
LoopItemObject GetSmallestDataIndexItem() { LoopItemObject smallestItem = null; int smallestIndex = int.MaxValue; if (itemsList != null) { foreach (LoopItemObject item in itemsList) { if (item.dataIndex < smallestIndex) { smallestIndex = item.dataIndex; smallestItem = item; } } } return(smallestItem); }
/// <summary> /// 在itemsList后面补上一个item /// </summary> void AddToBack(LoopItemObject backItem, LoopItemObject newItem, int newIndex, LoopItemData newData) { InitItem(newItem, newIndex, newData); // 计算新item的位置 if (scrollView.movement == UIScrollView.Movement.Vertical) { float offsetY = backItem.widget.height * 0.5f + gapDis + newItem.widget.height * 0.5f; if (arrangeDirection == ArrangeDirection.Down_to_Up) { offsetY *= -1f; } newItem.widget.transform.localPosition = backItem.widget.cachedTransform.localPosition - new Vector3(0f, offsetY, 0f); } else { float offsetX = backItem.widget.width * 0.5f + gapDis + newItem.widget.width * 0.5f; if (arrangeDirection == ArrangeDirection.Right_to_Left) { offsetX *= -1f; } newItem.widget.transform.localPosition = backItem.widget.cachedTransform.localPosition + new Vector3(offsetX, 0f, 0f); } }
/// <summary> /// 检验items的两端是否要补上或删除 /// </summary> void Validate() { if (datasList == null || datasList.Count == 0) { return; } // 如果itemsList还不存在 if (itemsList == null || itemsList.Count == 0) { itemsList = new List <LoopItemObject>(); LoopItemObject item = GetItemFromLoop(); if (tempFirstItem == -1) { InitItem(item, 0, datasList[0]); } else { InitItemDontReset(item, tempFirstItem, datasList[tempFirstItem]); } firstItem = lastItem = item; itemsList.Add(item); //Validate(); } // bool all_invisible = true; for (int i = 0; i < itemsList.Count; i++) { if (itemsList[i].widget.isVisible == true) { all_invisible = false; tempFirstItem = -1; } } if (all_invisible == true) { if (tempFirstItem == -1) { if (endDragPos.y > startDragPos.y) { if (lastItem.dataIndex < datasList.Count - 1) { if (itemsList.Count > 1) { itemsList.Remove(firstItem); //UnityEngine.Debug.Log("(((((((((((((((((((((( itemList.count is: " + itemsList.Count); PutItemToLoop(firstItem); firstItem = GetSmallestDataIndexItem();//itemsList[0]; } LoopItemObject item = GetItemFromLoop(); int index = lastItem.dataIndex + 1; AddToBack(lastItem, item, index, datasList[index]); lastItem = item; itemsList.Add(item); } } if (endDragPos.y < startDragPos.y) { if (firstItem.dataIndex > 0) { LoopItemObject item = GetItemFromLoop(); int index = firstItem.dataIndex - 1; AddToFront(firstItem, item, index, datasList[index]); firstItem = item; itemsList.Insert(0, item); itemsList.Remove(lastItem); //UnityEngine.Debug.Log(")))))))))))))))))))))) itemList.count is: " + itemsList.Count); PutItemToLoop(lastItem); lastItem = GetBiggestDataIndexItem();//itemsList[itemsList.Count - 1]; } } ResetPosition(itemsList); return; } else { if (lastItem.dataIndex < datasList.Count - 1) { LoopItemObject item = GetItemFromLoop(); int index = lastItem.dataIndex + 1; AddToBack(lastItem, item, index, datasList[index]); lastItem = item; itemsList.Add(item); } ResetPosition(itemsList); return; } } // 先判断前端是否要增减 if (firstItem.widget.isVisible) { // 判断要不要在它的前面补充一个item if (firstItem.dataIndex > 0) { LoopItemObject item = GetItemFromLoop(); // 初化:数据索引、大小、位置、显示 int index = firstItem.dataIndex - 1; //InitItem(item, index, datasList[index]); AddToFront(firstItem, item, index, datasList[index]); firstItem = item; itemsList.Insert(0, item); //Validate(); } } else { // 判断要不要将它移除 // 条件:自身是不可见的;且它后一个item也是不可见的(或被被裁剪过半的). // 这有个隐含条件是itemsList.Count>=2. if (itemsList.Count >= InvisibleCache) { bool isRemove = true; for (int i = 0; i < InvisibleCache; i++) { if (itemsList[i].widget.isVisible) { isRemove = false; } } if (isRemove) { itemsList.Remove(firstItem); //UnityEngine.Debug.Log("!!!!!!!!!!!!!!!!!! itemList.count is: " + itemsList.Count); PutItemToLoop(firstItem); firstItem = GetSmallestDataIndexItem();//itemsList[0]; } //Validate(); } } // 再判断后端是否要增减 if (lastItem.widget.isVisible) { // 判断要不要在它的后面补充一个item //UnityEngine.Debug.Log("11111111111111 lastItem.dataIndex " + lastItem.dataIndex + " datasList.Count " + datasList.Count + " itemlist count is: " + itemsList.Count); if (lastItem.dataIndex < datasList.Count - 1) { //UnityEngine.Debug.Log("2222222222222222 lastItem.dataIndex " + lastItem.dataIndex + " datasList.Count " + datasList.Count); LoopItemObject item = GetItemFromLoop(); // 初化:数据索引、大小、位置、显示 int index = lastItem.dataIndex + 1; AddToBack(lastItem, item, index, datasList[index]); lastItem = item; itemsList.Add(item); //Validate(); } } else { // 判断要不要将它移除 // 条件:自身是不可见的;且它前一个item也是不可见的(或被被裁剪过半的). // 这有个隐含条件是itemsList.Count>=2. //UnityEngine.Debug.Log("33333333333333333 lastItem.dataIndex " + lastItem.dataIndex + " datasList.Count " + datasList.Count); if (itemsList.Count >= InvisibleCache) { bool isRemove = true; for (int i = 1; i <= InvisibleCache; i++) { if (itemsList[itemsList.Count - i].widget.isVisible) { isRemove = false; } } if (isRemove) { //UnityEngine.Debug.Log("444444444444444444444 lastItem.dataIndex " + lastItem.dataIndex + " datasList.Count " + datasList.Count); itemsList.Remove(lastItem); //UnityEngine.Debug.Log("*********************** itemList.count is: " + itemsList.Count); PutItemToLoop(lastItem); lastItem = GetBiggestDataIndexItem();//itemsList[itemsList.Count - 1]; } //Validate(); } } //UnityEngine.Debug.Log("55555555555555555555555 itemsList.count " + itemsList.Count); ResetPosition(itemsList); }
/// <summary> /// 检验items的两端是否要补上或删除 /// </summary> void Validate() { if (datasList == null || datasList.Count == 0) { return; } // 如果itemsList还不存在 if (itemsList == null || itemsList.Count == 0) { itemsList = new List <LoopItemObject>(); LoopItemObject item = GetItemFromLoop(); Vector3 v3 = new Vector3(0, itemStartPos.y, 0); chatItemData d = datasList[0] as chatItemData; if (d.ItemType != 3) { itemStartPos = new Vector3(0, itemStartPos.y + 50, 0); } InitItem(item, 0, datasList[0]); itemStartPos = v3;//还原 firstItem = lastItem = item; itemsList.Add(item); //Validate(); } // bool all_invisible = true; foreach (LoopItemObject item in itemsList) { if (item.widget.isVisible == true) { all_invisible = false; } } if (all_invisible == true) { return; } // 先判断前端是否要增减 if (firstItem.widget.isVisible) { // 判断要不要在它的前面补充一个item if (firstItem.dataIndex > 0) { LoopItemObject item = GetItemFromLoop(); // 初化:数据索引、大小、位置、显示 int index = firstItem.dataIndex - 1; //InitItem(item, index, datasList[index]); AddToFront(firstItem, item, index, datasList[index]); firstItem = item; itemsList.Insert(0, item); //Validate(); //SpringPanel.Begin } } else { // 判断要不要将它移除 // 条件:自身是不可见的;且它后一个item也是不可见的(或被被裁剪过半的). // 这有个隐含条件是itemsList.Count>=2. if (itemsList.Count >= 2 && itemsList[0].widget.isVisible == false && itemsList[1].widget.isVisible == false) { itemsList.Remove(firstItem); PutItemToLoop(firstItem); firstItem = itemsList[0]; //Validate(); } } // 再判断后端是否要增减 if (lastItem.widget.isVisible) { // 判断要不要在它的后面补充一个item if (lastItem.dataIndex < datasList.Count - 1) { LoopItemObject item = GetItemFromLoop(); // 初化:数据索引、大小、位置、显示 int index = lastItem.dataIndex + 1; AddToBack(lastItem, item, index, datasList[index]); lastItem = item; itemsList.Add(item); //Validate(); } } else { // 判断要不要将它移除 // 条件:自身是不可见的;且它前一个item也是不可见的(或被被裁剪过半的). // 这有个隐含条件是itemsList.Count>=2. if (itemsList.Count >= 2 && itemsList[itemsList.Count - 1].widget.isVisible == false && itemsList[itemsList.Count - 2].widget.isVisible == false) { itemsList.Remove(lastItem); PutItemToLoop(lastItem); lastItem = itemsList[itemsList.Count - 1]; //UIGrid ug =new UIGrid(); //Validate(); } } //防止还没到底的时候就回弹BUG(效果不好) if (firstItem.dataIndex != 0 && lastItem.dataIndex != datasList.Count - 1) { SpringPanel sp = gameObject.GetComponent <SpringPanel>(); if (sp != null) { sp.enabled = false; } } }