private void ScrollUpdate() { curTimes--; if (curTimes < 0) { lastMainItem = _allItem[mainIndex]; SetMainItemRender(lastMainItem, true); changeFun.DynamicInvoke(_allItem[mainIndex].Data); isMoving = false; return; } for (int i = _allItem.Count - 1; i >= 0; i--) { CItemRender item = _allItem[i]; if (isNext) { Vector3 nextPos = new Vector3(item.x + itemWidth, item.y, item.z); iTween.MoveTo(item.go, iTween.Hash("position", nextPos, "isLocal", true, "speed", speed * (curTimes + 1), "easetype", iTween.EaseType.linear, "oncomplete", "AfterScrollUpdate", "oncompletetarget", this)); } else { Vector3 nextPos = new Vector3(item.x - itemWidth, item.y, item.z); iTween.MoveTo(item.go, iTween.Hash("position", nextPos, "isLocal", true, "speed", speed * (curTimes + 1), "easetype", iTween.EaseType.linear, "oncomplete", "AfterScrollUpdate", "oncompletetarget", this)); } } }
private void OnMoveUp(CItemRender item, TweenAlpha tween) { if (tween != null) { UnityEngine.Object.DestroyImmediate(tween); } item.GetComponent <UIWidget>().alpha = 1; item.go.SetActive(false); firstMoveItemIndex = _allItem.IndexOf(item); if (_allItem.Count > firstMoveItemIndex + 1) { CItemRender firstItem = _allItem[firstMoveItemIndex + 1]; float offY = item.y - firstItem.y; for (int n = firstMoveItemIndex, len = _allItem.Count; n < len; n++) { CItemRender tempItem = _allItem[n]; //tempItem.SetParent(firstItem.tran); iTween.Stop(tempItem.go); Hashtable hash = iTween.Hash("y", tempItem.y + offY, "time", 0.5f, "islocal", true); iTween.MoveTo(tempItem.go, hash); } //Hashtable hash = iTween.Hash("y", item.y, "time", 0.5f, "islocal", true); //iTween.MoveTo(firstItem.go, hash); } doneKey = UILoopManager.SetTimeout(OnDown, 0.6f); }
private void ResetItems() { CItemRender item; for (int i = 0; i < _allItem.Count; i++) { item = _allItem[i]; item.name = "Item" + i; CItemRender w = item; if (_dataCondition != null) { w.SetCondition(_dataCondition); } w.Data = _dataProvider[i]; float itemX, itemY; //一列一列的顺序? itemY = content.baseClipRegion.w / 2 + content.baseClipRegion.y + offY; itemX = i * itemWidth; item.tran.localPosition = new Vector3(itemX, itemY, 0); List <BoxCollider> boxList = DisplayUtil.GetComponentByType <BoxCollider>(item.go); for (int n = 0, len = boxList.Count; n < len; n++) { EventUtil.AddHover(boxList[n].gameObject, OnHover, item); } } }
private void OnSliceOut(CItemRender item) { UILoopManager.ClearTimeout(doneKey); Hashtable hash = iTween.Hash("x", width, "time", fadeTime, "islocal", true); iTween.MoveTo(item.go, hash); deplayKeyList.Add(UILoopManager.SetTimeout <CItemRender, TweenAlpha>(OnMoveUp, fadeTime, item, null)); }
private void OnFadeOut(CItemRender item) { UILoopManager.ClearTimeout(doneKey); var tween = TweenAlpha.Begin(item.go, fadeTime, 0f); listAlpha.Add(tween); deplayKeyList.Add(UILoopManager.SetTimeout <CItemRender, TweenAlpha>(OnMoveUp, fadeTime, item, tween)); }
private void OnDoubleClickItem(object arg) { CItemRender c = arg as CItemRender; if (OnItemDoubleClick != null) { OnItemDoubleClick(c); } }
private int sortItem(CItemRender a, CItemRender b) { if (a.x < b.x) { return(-1); } if (a.x > b.x) { return(1); } return(0); }
private void RetrieveRender(CItemRender item) { //item = _allItem[_allItem.Count - 1]; _allItem.Remove(item); _itemPool.Add(item); //item.SetParent(Recycle); //item.tran.localPosition = Vector3.zero; //item.SetActive(false); if (delayKey == -1) { delayKey = UILoopManager.SetTimeout(DelayRetrieveRender, 0.01f); } }
public void AfterScrollNext() { scrollNum++; //移动结束 if (scrollNum >= _allItem.Count) { scrollNum = 0; //移到最后,要返回到最前面 _allItem[_allItem.Count - 1].x = _allItem[0].x - itemWidth; _allItem.Sort(sortItem); isMoving = false; lastMainItem = _allItem[mainIndex]; SetMainItemRender(lastMainItem, true); changeFun.DynamicInvoke(_allItem[mainIndex].Data); } }
public void ScrollNext(GameObject obj) { //正在移动被点击时,直接重置 if (isMoving) { return; } SetMainItemRender(lastMainItem, false); for (int i = _allItem.Count - 1; i >= 0; i--) { CItemRender item = _allItem[i]; Vector3 nextPos = new Vector3(item.x + itemWidth, item.y, item.z); iTween.MoveTo(item.go, iTween.Hash("position", nextPos, "isLocal", true, "speed", speed, "easetype", iTween.EaseType.easeInOutSine, "oncomplete", "AfterScrollNext", "oncompletetarget", this)); } isMoving = true; }
private void OnItemPress(GameObject go, bool isPressed, bool needEvent) { if (isPressed) { CItemRender c = go.GetDisplayObj() as CItemRender; SelectedItem = c.Data; if (spSelected != null) { spSelected.transform.localPosition = c.tran.localPosition; } if (OnItemSelect != null && needEvent) { OnItemSelect(c); } } }
private void SetMainItemRender(CItemRender item, bool flag) { mainBorder.gameObject.SetActive(flag); if (flag) { item.height = mainSizeY; item.width = mainSizeX; //mainBorder.pivot = UIWidget.Pivot.Center; //mainBorder.transform.localPosition = new Vector3(item.x + item.width / 2, item.y - item.height / 2); } else { item.height = oriSizeY; item.width = oriSizeX; } }
public void SetDataProvider <T>(IEnumerable <T> value) { if (IsSame <T>(_dataProvider, value)) { return; } _dataProvider = _dataProvider ?? new List <object>(); while (_dataProvider.Count > 0) { _dataProvider.RemoveAt(0); } if (value == null) { return; } foreach (var t in value) { _dataProvider.Add(t); } int curLen = _dataProvider.Count; for (var i = 0; i < curLen; i++) { CItemRender item; if (_itemPool.Count < curLen) { item = (CItemRender)Activator.CreateInstance(_itemRender); item.name = "Item" + i; _itemPool.Add(item); } else { item = _itemPool[i]; } item.Data = _dataProvider[i]; item.SetParent(gameObject); item.SetActive(true); } for (var i = curLen; i < _itemPool.Count; i++) { CItemRender item = _itemPool[i]; item.SetActive(false); } Reposition(); }
private void ResetItems() { CItemRender item; for (int i = 0; i < _allItem.Count; i++) { item = _allItem[i]; item.name = "Item" + i; CItemRender w = item; w.Data = _dataProvider[i]; float itemX, itemY; //一列一列的顺序? itemY = content.baseClipRegion.w / 2 + content.baseClipRegion.y + offY; itemX = (i - 1) * itemWidth; item.tran.localPosition = new Vector3(itemX, itemY, 0); } }
public void RemoveItem(CItemRender item) { if (item != null) { if (delList.Contains(item) == false) { delList.Add(item); } dataProvider.Remove(item.Data); } if (useFade) { OnFadeOut(item); } else { OnSliceOut(item); } }
protected virtual void OnItemPress(GameObject go, bool needEvent) { CItemRender c = go.GetDisplayObj() as CItemRender; if (selectedItemRender != null) { selectedItemRender.SetSelected(false); } selectedItemRender = c; c.SetSelected(true); SelectedItem = c.Data; if (spSelected != null) { spSelected.transform.localPosition = c.tran.localPosition; } if (OnItemSelect != null && needEvent) { OnItemSelect(c); } }
private void InitCellRender(bool SetData = true) { int rowNum = Convert.ToInt32(Mathf.Ceil(this.height / (float)itemHeight)); int renderNum = Math.Min(_dataProvider.Count, rowNum * ColNum); bool isEnough = _allItem.Count >= renderNum; int n = Mathf.Abs(_allItem.Count - renderNum); CItemRender item; while (n > 0) { if (isEnough == true) { item = _allItem[_allItem.Count - 1]; RetrieveRender(item); } else { item = GetOneRender(); _allItem.Add(item); item.SetParent(Content.transform); } n--; } if (SetData == true || isEnough == false) { for (int i = 0; i < _allItem.Count; i++) { item = _allItem[i]; item.name = "Item" + i; CItemRender w = item; w.Data = _dataProvider[i]; int offY = i / ColNum; float itemY = (offY * _itemHeight * -1); float itemX = (itemWidth) * (i % ColNum); item.tran.localPosition = new Vector3(PaddingLeft + itemX, -PaddingTop + itemY, 0); } firstPoint = 0; lastPoint = renderNum - 1; } }
private void OnLoop() { if ((stopOnOver && IsItemOver()) || isStop) { return; } float leftX = content.baseClipRegion.x - content.baseClipRegion.z / 2 + offSetLeft; float rightX = content.baseClipRegion.z / 2 + content.baseClipRegion.x + offSetRight; for (int i = _allItem.Count - 1; i >= 0; i--) { CItemRender item = _allItem[i]; item.x -= speed; if (item.x < leftX) { float offX = leftX - item.x; item.x = Math.Max(rightX, _allItem[_allItem.Count - 1].x + itemWidth); item.x += offX; } } _allItem.Sort(sortItem); }
private void StopMove() { delList.Clear(); if (_allItem != null) { for (int n = 0, len = _allItem.Count; n < len; n++) { CItemRender tempItem = _allItem[n]; //tempItem.SetParent(firstItem.tran); iTween.Stop(tempItem.go); } } if (_itemPool != null) { for (int n = 0, len = _itemPool.Count; n < len; n++) { CItemRender tempItem = _itemPool[n]; //tempItem.SetParent(firstItem.tran); iTween.Stop(tempItem.go); } } for (int i = 0, len = listAlpha.Count; i < len; i++) { if (listAlpha[i]) { UnityEngine.Object.DestroyImmediate(listAlpha[i]); } } for (int r = 0, len = listAlpha.Count; r < len; r++) { UILoopManager.ClearTimeout(deplayKeyList[r]); } listAlpha.Clear(); deplayKeyList.Clear(); UILoopManager.ClearTimeout(doneKey); }
private void CheckShowItem(bool resetData = false) { float offY = Content.transform.localPosition.y; for (int i = _allItem.Count - 1; i >= 0; i--) { CItemRender item = _allItem[i]; if ((-item.y + itemHeight) <= offY || (offY + this.height) <= (-item.y)) { RetrieveRender(item); } } int n = int.Parse(Mathf.Floor(offY / itemHeight).ToString()); int nowFirstPoint = n * ColNum; n = int.Parse(Mathf.Ceil((this.height + offY) / (float)itemHeight).ToString()); int nowLastPoint = ColNum * n - 1; nowLastPoint = Mathf.Max(0, nowLastPoint); nowLastPoint = Math.Min(nowLastPoint, _dataProvider.Count - 1); if (nowLastPoint > lastPoint) { int needItemNum = nowLastPoint - lastPoint; for (int i = 1; i <= needItemNum; i++) { int index = lastPoint + i; if (_dataProvider.Count <= index) { continue; } CItemRender item = GetOneRender(); item.Data = _dataProvider[index]; int offYIndex = index / ColNum; float itemY = (offYIndex * _itemHeight * -1); float itemX = (itemWidth) * ((i - 1) % ColNum); item.tran.localPosition = new Vector3(PaddingLeft + itemX, -PaddingTop + itemY, 0); _allItem.Add(item); } } if (nowLastPoint == lastPoint && nowFirstPoint == firstPoint && (nowLastPoint - nowFirstPoint + 1) > _allItem.Count) { int needItemNum = (nowLastPoint - nowFirstPoint + 1) - _allItem.Count; for (int i = 1; i <= needItemNum; i++) { int index = lastPoint - needItemNum + i; if (_dataProvider.Count <= index) { continue; } CItemRender item = GetOneRender(); item.Data = _dataProvider[index]; int offYIndex = index / ColNum; float itemY = (offYIndex * _itemHeight * -1); float itemX = (itemWidth) * ((i - 1) % ColNum); item.tran.localPosition = new Vector3(PaddingLeft + itemX, -PaddingTop + itemY, 0); _allItem.Add(item); } } if (nowFirstPoint < firstPoint) { int needItemNum = firstPoint - nowFirstPoint; for (int i = 1; i <= needItemNum; i++) { int index = firstPoint - i; if (_dataProvider.Count <= index) { continue; } CItemRender item = GetOneRender(); item.Data = _dataProvider[index]; int offYIndex = index / ColNum; float itemY = (offYIndex * _itemHeight * -1); float itemX = (itemWidth) * (ColNum - ((i - 1) % ColNum) - 1); item.tran.localPosition = new Vector3(PaddingLeft + itemX, -PaddingTop + itemY, 0); _allItem.Insert(0, item); } } firstPoint = nowFirstPoint; lastPoint = nowLastPoint; if (resetData) { for (int i = 0; i <= lastPoint - firstPoint; i++) { CItemRender item = _allItem[i]; item.Data = _dataProvider[firstPoint + i]; } } }
private int GetItemIndex(CItemRender item) { return(_dataProvider.IndexOf(item.Data)); }
protected virtual void ResetItems() { CItemRender item; for (int i = 0; i < _allItem.Count; i++) { item = _allItem[i]; item.name = "Item" + i; CItemRender w = item; if (item.IsActive() == false) { item.SetActive(true); } w.SetAlpha(1); if (_dataCondition != null) { w.SetCondition(_dataCondition); } w.index = i + preIndex; w.Data = _dataProvider[i]; int offX = i / RowNum; int offY = i / ColNum; float itemX, itemY; if (_horizon) { itemY = -(itemHeight + gapV) * (i % RowNum); //一列一列的顺序? itemX = offX * (itemWidth + gapU); } else { itemY = (offY * (_itemHeight * item.localScale.y + gapV) * -1); itemX = (itemWidth + gapU) * (i % ColNum); } item.tran.localPosition = new Vector3(PaddingLeft + itemX, -PaddingTop + itemY, 0); // UIEventListener listener = UIEventListener.Get(item.go); UIEventListener.Get(item.go); //listener.onHover = OnItemHover; if (IsAddItemEvent == true) { EventUtil.AddHover(item.go, OnItemHover, item.go); EventUtil.AddDoubleClick(item.go, OnDoubleClickItem, item); EventUtil.AddClick(item.go, OnItemPress, item.go); } else { EventUtil.RemoveHover(item.go, OnItemHover); EventUtil.RemoveDoubleClick(item.go, OnDoubleClickItem); EventUtil.RemoveClick(item.go, OnItemPress); } } if (_dataProvider == null) { TotalWidth = 0; TotalHeight = 0; } else { if (_horizon) { var itemW = (_itemWidth + gapU) * Mathf.CeilToInt(_dataProvider.Count / (float)RowNum) - gapU; TotalWidth = PaddingLeft * 2 + itemW; } else { var itemH = (_itemHeight + gapV) * Mathf.CeilToInt(_dataProvider.Count / (float)ColNum) - gapV; TotalHeight = PaddingTop + itemH + PaddingBottom; } } UpdateScrollBar(); }
protected override void ResetItems() { CItemRender item; bool isSameHeight = true; float realTotalHeight = 0; for (int i = 0; i < _allItem.Count; i++) { item = _allItem[i]; item.name = "Item" + i; CItemRender w = item; if (_dataCondition != null) { w.SetCondition(_dataCondition); } w.Data = _dataProvider[i]; //默认为itemHeight(等高情况) //不等高情况,请自行设置CItemRender的height属性 float realItemHeight = 0; if (w.height == 0) { realItemHeight = _itemHeight; } else { realItemHeight = w.height; isSameHeight = false; } int offX = i / RowNum; int offY = i / ColNum; float itemX, itemY; if (horizon) { itemY = -(itemHeight + 5) * (i % RowNum); //一列一列的顺序? itemX = offX * itemWidth; } else { if (isSameHeight) { itemY = (offY * _itemHeight * -1); } else { itemY = (realTotalHeight * -1); } itemX = (itemWidth + 5) * (i % ColNum); } item.tran.localPosition = new Vector3(PaddingLeft + itemX, -PaddingTop + itemY, 0); realTotalHeight += realItemHeight; UIEventListener listener = UIEventListener.Get(item.go); //listener.onHover = OnItemHover; EventUtil.AddHover(item.go, OnItemHover, item.go); listener.onClick = OnItemPress; } if (_dataProvider == null) { TotalWidth = 0; TotalHeight = 0; } else { if (horizon) { var itemW = _itemWidth * _dataProvider.Count / (float)RowNum; TotalWidth = PaddingLeft * 2 + Mathf.CeilToInt(itemW); } else { float itemH = 0; if (isSameHeight) { itemH = _itemHeight * _dataProvider.Count / float.Parse(ColNum.ToString()); } else { itemH = realTotalHeight; } TotalHeight = PaddingTop + Mathf.CeilToInt(itemH) + PaddingBottom; } } if (keepCurPos == false) { UpdateScrollBar(); } else { if (ShowBar) { bool needShowBar = TotalHeight > height || TotalWidth > width; Bar.gameObject.SetActive(needShowBar); } else { Bar.gameObject.SetActive(false); } } }
public void SetDataProvider <T>(IEnumerable <T> value) { if (_itemRender == null) { Debug.LogError("set itemRender first!"); return; } if (_itemPool == null) { _itemPool = new List <CItemRender>(); } if (_allItem == null) { _allItem = new List <CItemRender>(); btnLeft.AddClick(ScrollPre); btnRight.AddClick(ScrollNext); } SetData <T>(value); //_dataProvider = (value ?? new List<T>()) as List<object>; bool isEnough = _allItem.Count >= _dataProvider.Count; int n = Mathf.Abs(_allItem.Count - _dataProvider.Count); CItemRender item; while (n > 0) { if (isEnough == true) { item = _allItem[_allItem.Count - 1]; _itemPool.Add(item); _allItem.RemoveAt(_allItem.Count - 1); item.SetParent(recycle); item.tran.localPosition = Vector3.zero; item.SetActive(false); } else { if (_itemPool.Count > 0) { item = _itemPool[0]; _itemPool.RemoveAt(0); item.SetActive(true); } else { item = (CItemRender)Activator.CreateInstance(_itemRender); EventUtil.AddHover(item, OnHover); //item.width = itemWidth; } item.SetParent(_content.transform); _allItem.Add(item); } n--; } ResetItems(); lastDataProvider = value; lastMainItem = _allItem[mainIndex]; oriSizeX = _allItem[mainIndex].width; oriSizeY = _allItem[mainIndex].height; SetMainItemRender(lastMainItem, false); }