public override void CalculateLayoutInputHorizontal() { if (ItemNum == items.Count) { return; } _isUpdatePos = false; items.Clear(); rectChildren.Clear(); for (int i = 0; i < rectTransform.childCount; i++) { var rect = rectTransform.GetChild(i) as RectTransform; if (rect == null || !rect.gameObject.activeInHierarchy) { continue; } BaseItemRender item = rect.GetComponent <BaseItemRender>(); if (item != null) { items.Add(item); rectChildren.Add(rect); } } m_Tracker.Clear(); }
public void SetSelectItem <T>(string field, object value) { if (!string.IsNullOrEmpty(field)) { FieldInfo fi = typeof(T).GetField(field); if (fi != null) { for (int i = 0; i < _dataProvider.Length; i++) { T itemData = (T)_dataProvider[i]; if (fi.GetValue(itemData).Equals(value)) { if (_renders.ContainsKey(i)) { SetSelectItem(_renders[i]); } else if (_listMax > 0) { if (currentSelect != null) { currentSelect.SetSelect(false); currentSelect = null; } InternalMove(i); SetSelectItem(_renders[i]); } isselect = true; break; } } } } }
private void MoveBottomToTop(int axis) { int changenum = 1; changenum = Math.Max(changenum, 1); if (_listMin < changenum) { changenum = _listMin; } for (int i = 0; i < changenum; i++) { BaseItemRender render = _renders[_listMax - i]; render.SetItemIndex(_listMin - 1 - i, _dataProvider.Length); render.SetData(_dataProvider[_listMin - 1 - i]); render.gameObject.name = "item" + (_listMin - 1 - i); _renders.Remove(_listMax - i); _renders.Add(_listMin - 1 - i, render); var rectTran = render.gameObject.GetRectTransform(); // rectTran.SetAsFirstSibling(); ResetPosition(rectTran, axis, (_listMax + 1 - _listMin) * (_gridGroup.cellSize[axis] + _gridGroup.spacing[axis]) * (axis == 1 ? 1 : -1)); var oldSize = _contTransform.sizeDelta; float delta = changenum * (_gridGroup.cellSize[axis] + _gridGroup.spacing[axis]); oldSize[axis] -= delta; _contTransform.sizeDelta = oldSize; // float moveDistance = _contTransform.pivot[axis] * delta * (axis == 1 ? 1 : -1); // ResetPosition(_contTransform, axis, moveDistance); } _listMin -= changenum; _listMax -= changenum; }
private bool FindClosestPos(BaseItemRender render) { bool canMove = false; if (_scrollView.vertical || _scrollView.horizontal) { int axis = 0; int flag = 1; float curPos = CalculateCurPos(ref axis, ref flag); if (_scrollView.vertical) { if (flag > 0) { curPos -= _gridLayoutGroup.padding.top; } else { curPos += _gridLayoutGroup.padding.bottom; } } else { if (flag > 0) { curPos -= _gridLayoutGroup.padding.right; } else { curPos += _gridLayoutGroup.padding.left; } } curPos -= _gridLayoutGroup.cellSize[axis] * 0.5f * flag; int idx; if (render != null) { idx = render.GetItemIndex(); } else { idx = Mathf.RoundToInt(flag * curPos / (_gridLayoutGroup.cellSize[axis] + _gridLayoutGroup.spacing[axis])); if (IsSensitive && _curTarget != null && idx == _curTarget.GetItemIndex()) { float curTargetPos = _curTarget.GetItemIndex() * (_gridLayoutGroup.cellSize[axis] + _gridLayoutGroup.spacing[axis]); if (flag * curPos - curTargetPos > _gridLayoutGroup.cellSize[axis] * SensitiveParam) { idx++; } else if (curTargetPos - flag * curPos > _gridLayoutGroup.cellSize[axis] * SensitiveParam) { idx--; } } if (idx < 0) { idx = 0; } else if (idx >= _contentRect.childCount) { idx = _contentRect.childCount - 1; } render = _contentRect.GetChild(idx).GetComponent <BaseItemRender>(); } float delta = flag * (_gridLayoutGroup.cellSize[axis] + _gridLayoutGroup.spacing[axis]) * idx - curPos; _targetPos = _contentRect.anchoredPosition; _targetPos[axis] += delta; canMove = true; } if (_curTarget != render) { if (_curTarget != null && OnCenterBegin != null) { OnCenterBegin(_curTarget, false); } _curTarget = render; if (OnCenterBegin != null) { OnCenterBegin(_curTarget, true); } } return(canMove); }
public void CenterOn(BaseItemRender render) { _isCentering = FindClosestPos(render); }
public void Reset() { _curTarget = null; }
public void SetSelectItem(BaseItemRender render) { if (render != null) { if (currentSelect != null) { currentSelect.SetSelect(false); } currentSelect = render; currentSelect.SetSelect(true); if (_clickHandler != null) { _clickHandler(render.gameObject); } render.SetSelect(); if (_content != null && _scrollRect != null) { if (_uiCenterOnChild != null) { _uiCenterOnChild.CenterOn(render); } else { RectTransform viewRect; if ((UnityEngine.Object)_scrollRect.viewport == (UnityEngine.Object)null) { viewRect = _scrollRect.gameObject.GetRectTransform(); } else { viewRect = _scrollRect.viewport; } if (_scrollRect.vertical) { float anchorGridToScrollview = (_contTransform.anchorMin.y + _contTransform.anchorMax.y) * 0.5f; float dGridAnchToScrTop = (1 - anchorGridToScrollview) * viewRect.rect.height; float dGridPivotToScrTop = dGridAnchToScrTop - _contTransform.anchoredPosition.y; float dGridPivotToGridTop = _contTransform.rect.height * (1 - _contTransform.pivot.y); float dScrTopToGridTop = dGridPivotToGridTop - dGridPivotToScrTop; RectTransform itemRectTransform = render.gameObject.GetRectTransform(); float dItemTopToGridTop = -itemRectTransform.anchoredPosition.y - (1 - itemRectTransform.pivot.y) * _gridGroup.cellSize.y; if (dItemTopToGridTop < dScrTopToGridTop) //上边缘被挡住了,需要下拉 { float moveDistance = dItemTopToGridTop - dScrTopToGridTop; Vector2 v = _contTransform.anchoredPosition; v.y += moveDistance; _contTransform.anchoredPosition = v; } else { float dGridAnchToScrBottom = anchorGridToScrollview * viewRect.rect.height; float dGridPivotToScrBottom = dGridAnchToScrBottom + _contTransform.anchoredPosition.y; float dGridPivotToGridBottom = _contTransform.rect.height * _contTransform.pivot.y; float dScrBottomToGridBottom = dGridPivotToGridBottom - dGridPivotToScrBottom; float dItemBottomToGridBottom = _contTransform.rect.height + itemRectTransform.anchoredPosition.y - itemRectTransform.pivot.y * _gridGroup.cellSize.y; if (dItemBottomToGridBottom < dScrBottomToGridBottom) //下边缘被挡住了,需要上拉 { float moveDistance = dScrBottomToGridBottom - dItemBottomToGridBottom; Vector2 v = _contTransform.anchoredPosition; v.y += moveDistance; _contTransform.anchoredPosition = v; } } } else if (_scrollRect.horizontal) { float anchorGridToScrollview = (_contTransform.anchorMin.x + _contTransform.anchorMax.x) * 0.5f; float dGridAnchToScrLeft = anchorGridToScrollview * viewRect.rect.width; float dGridPivotToScrLeft = dGridAnchToScrLeft + _contTransform.anchoredPosition.x; float dGridPivotToGridLeft = _contTransform.rect.width * _contTransform.pivot.x; float dScrLeftToGridLeft = dGridPivotToGridLeft - dGridPivotToScrLeft; RectTransform itemRectTransform = render.gameObject.GetRectTransform(); float dItemLeftToGridLeft = itemRectTransform.anchoredPosition.x - itemRectTransform.pivot.x * _gridGroup.cellSize.x; if (dItemLeftToGridLeft < dScrLeftToGridLeft) //左边缘被挡住了,需要右拉 { float moveDistance = dScrLeftToGridLeft - dItemLeftToGridLeft; Vector2 v = _contTransform.anchoredPosition; v.x += moveDistance; _contTransform.anchoredPosition = v; } else { float dGridAnchToScrRight = (1 - anchorGridToScrollview) * viewRect.rect.width; float dGridPivotToScrRight = dGridAnchToScrRight - _contTransform.anchoredPosition.x; float dGridPivotToGridRight = _contTransform.rect.width * (1 - _contTransform.pivot.x); float dScrRightToGridRight = dGridPivotToGridRight - dGridPivotToScrRight; float dItemRightToGridRight = _contTransform.rect.width - itemRectTransform.anchoredPosition.x + (1 - itemRectTransform.pivot.x) * _gridGroup.cellSize.x; if (dItemRightToGridRight < dScrRightToGridRight) //右边缘被挡住了,需要左拉 { float moveDistance = dItemRightToGridRight - dScrRightToGridRight; Vector2 v = _contTransform.anchoredPosition; v.x += moveDistance; _contTransform.anchoredPosition = v; } } } } } } }