| | |
| | | using System.Collections; |
| | | using System.Collections.Generic; |
| | | using UnityEngine; |
| | | using EnhancedUI.EnhancedScroller; |
| | | using System; |
| | | using UnityEngine.UI; |
| | | public enum EnhanceLockType |
| | | { |
| | | None, |
| | | LockHorizonRight, |
| | | LockHorizonLeft, |
| | | LockVerticalTop, |
| | | LockVerticalBottom, |
| | | KeepHorizon, |
| | | KeepVertical, |
| | | KeepVertical2, |
| | | } |
| | | public class ScrollerController : MonoBehaviour, IEnhancedScrollerDelegate { |
| | | |
| | | private List<ScrollerData> _data = new List<ScrollerData>(); |
| | | |
| | | public delegate void OnRefreshCellDelegate(ScrollerDataType type, CellView cell); |
| | | public event OnRefreshCellDelegate OnRefreshCell; |
| | | |
| | | public delegate bool OnDynamicCell(ScrollerDataType type,int index,out float height); |
| | | public event OnDynamicCell OnGetDynamicSize; |
| | | |
| | | public event Action OnRefreshCompleteEvent; |
| | | |
| | | |
| | | public EnhancedScrollerCellView GetCellView(EnhancedScroller scroller, int dataIndex, int cellIndex) |
| | | { |
| | | CellView cell = GetCellView(scroller, dataIndex); |
| | | if (!cell.gameObject.activeSelf) cell.gameObject.SetActive(true); |
| | | cell.SetData(_data[dataIndex], _data[dataIndex].m_ScrollerType,this); |
| | | if (_data[dataIndex].OnClick != null) { |
| | | cell.OnClick = _data[dataIndex].OnClick; |
| | | } |
| | | cell.info = _data[dataIndex].info; |
| | | if (OnRefreshCell != null) { |
| | | OnRefreshCell(_data[dataIndex].m_ScrollerType, cell); |
| | | } |
| | | cell.RefreshUI(); |
| | | return cell; |
| | | } |
| | | |
| | | private CellView GetCellView(EnhancedScroller scroller, int dataIndex) |
| | | { |
| | | CellView cell = null; |
| | | switch (_data[dataIndex].m_ScrollerType) { |
| | | case ScrollerDataType.Header: |
| | | cell = scroller.GetCellView(m_CellHeaderPrefab) as CellView; |
| | | break; |
| | | case ScrollerDataType.Normal: |
| | | cell = scroller.GetCellView(m_CellNomalPrefab) as CellView; |
| | | break; |
| | | case ScrollerDataType.Tail: |
| | | cell = scroller.GetCellView(m_CellTailPrefab) as CellView; |
| | | break; |
| | | case ScrollerDataType.Extra1: |
| | | cell = scroller.GetCellView(m_CellExtraPrefab1) as CellView; |
| | | break; |
| | | case ScrollerDataType.Extra2: |
| | | cell = scroller.GetCellView(m_CellExtraPrefab2) as CellView; |
| | | break; |
| | | case ScrollerDataType.Extra3: |
| | | cell = scroller.GetCellView(m_CellExtraPrefab3) as CellView; |
| | | break; |
| | | } |
| | | return cell; |
| | | } |
| | | |
| | | public float GetCellViewSize(EnhancedScroller scroller, int dataIndex) |
| | | { |
| | | if (OnGetDynamicSize != null) { |
| | | float height = 0; |
| | | if (OnGetDynamicSize(_data[dataIndex].m_ScrollerType, _data[dataIndex].index,out height)) { |
| | | return height; |
| | | } |
| | | } |
| | | switch (_data[dataIndex].m_ScrollerType) { |
| | | case ScrollerDataType.Header: |
| | | return m_CellHeaderPrefab.height; |
| | | case ScrollerDataType.Normal: |
| | | return m_CellNomalPrefab.height; |
| | | case ScrollerDataType.Tail: |
| | | return m_CellTailPrefab.height; |
| | | case ScrollerDataType.Extra1: |
| | | return m_CellExtraPrefab1.height; |
| | | case ScrollerDataType.Extra2: |
| | | return m_CellExtraPrefab2.height; |
| | | case ScrollerDataType.Extra3: |
| | | return m_CellExtraPrefab3.height; |
| | | } |
| | | return 80; |
| | | } |
| | | |
| | | public void OnRefreshCellActive(CellView cell) |
| | | { |
| | | if (OnRefreshCell != null) { |
| | | OnRefreshCell(cell.type, cell); |
| | | } |
| | | } |
| | | |
| | | public int GetNumberOfCells(EnhancedScroller scroller) |
| | | { |
| | | return _data.Count; |
| | | } |
| | | |
| | | public EnhancedScroller m_Scorller; |
| | | private ScrollRect m_ScrollRect; |
| | | public ScrollRect mScrollRect { |
| | | get { |
| | | if (m_ScrollRect == null) |
| | | m_ScrollRect = m_Scorller.GetComponent<ScrollRect>(); |
| | | return m_ScrollRect; |
| | | } |
| | | } |
| | | public CellView m_CellHeaderPrefab; |
| | | public CellView m_CellNomalPrefab; |
| | | public CellView m_CellTailPrefab; |
| | | public CellView m_CellExtraPrefab1; |
| | | public CellView m_CellExtraPrefab2; |
| | | public CellView m_CellExtraPrefab3; |
| | | public int maxCellCnt = 0; |
| | | |
| | | public bool horizontal = false; |
| | | public bool vertical = false; |
| | | private bool inited = false; |
| | | private int cacheJump = -1; |
| | | private void Awake() |
| | | { |
| | | m_Scorller.Delegate = this; |
| | | horizontal = mScrollRect.horizontal; |
| | | vertical = mScrollRect.vertical; |
| | | |
| | | inited = m_Scorller.inited; |
| | | m_Scorller.OnFirstLoadAllEvent += OnFirstLoadAllEvent; |
| | | if (m_Scorller.OnCompLoad == null && !m_Scorller.inited) |
| | | { |
| | | m_Scorller.OnCompLoad = OnCompLoad; |
| | | } |
| | | HideDefaultCell(); |
| | | } |
| | | |
| | | private void OnFirstLoadAllEvent() |
| | | { |
| | | if (cacheJump != -1) |
| | | { |
| | | JumpIndex(cacheJump); |
| | | } |
| | | } |
| | | |
| | | private void HideDefaultCell() |
| | | { |
| | | HideDefaultCell(m_CellHeaderPrefab); |
| | | HideDefaultCell(m_CellNomalPrefab); |
| | | HideDefaultCell(m_CellTailPrefab); |
| | | HideDefaultCell(m_CellExtraPrefab1); |
| | | HideDefaultCell(m_CellExtraPrefab2); |
| | | HideDefaultCell(m_CellExtraPrefab3); |
| | | } |
| | | |
| | | private void HideDefaultCell(CellView _cell) |
| | | { |
| | | if (_cell != null) |
| | | { |
| | | _cell.gameObject.SetActive(false); |
| | | } |
| | | } |
| | | |
| | | List<CellView> list = new List<CellView>(); |
| | | |
| | | private void OnCompLoad() |
| | | { |
| | | inited = true; |
| | | if (_data.Count > 0) |
| | | { |
| | | Restart(); |
| | | } |
| | | } |
| | | |
| | | public void Refresh() |
| | | { |
| | | inited = m_Scorller.inited; |
| | | if (m_Scorller.OnCompLoad == null && !m_Scorller.inited) |
| | | { |
| | | m_Scorller.OnCompLoad = OnCompLoad; |
| | | } |
| | | _data.Clear(); |
| | | |
| | | if (!inited) |
| | | { |
| | | return; |
| | | } |
| | | |
| | | if(m_Scorller.LayoutGroup != null) |
| | | { |
| | | m_Scorller.LayoutGroup.spacing = m_Scorller.spacing; |
| | | } |
| | | |
| | | lastScrollPos = horizontal ? mScrollRect.horizontalNormalizedPosition : mScrollRect.verticalNormalizedPosition; |
| | | lastContentSize = m_Scorller._ScrollSize; |
| | | |
| | | mScrollRect.verticalNormalizedPosition = 1; |
| | | mScrollRect.horizontalNormalizedPosition = 0; |
| | | |
| | | lastScrollPos = Mathf.Clamp01(lastScrollPos); |
| | | |
| | | } |
| | | |
| | | public CellView GetActiveCellView(int _index) |
| | | { |
| | | if (m_Scorller == null) |
| | | { |
| | | return null; |
| | | } |
| | | var _cellView = m_Scorller.GetActiveCellView(_index); |
| | | if (_cellView != null) |
| | | { |
| | | return _cellView as CellView; |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | public void AddCell(ScrollerDataType type, int index, Action<CellView> action = null, CellInfo? info = null) |
| | | { |
| | | ScrollerData data = null; |
| | | switch (type) { |
| | | case ScrollerDataType.Header: |
| | | data = new ScrollerHeaderData(index, action); |
| | | break; |
| | | case ScrollerDataType.Normal: |
| | | data = new ScrollerNormalData(index, action); |
| | | break; |
| | | case ScrollerDataType.Tail: |
| | | data = new ScrollerTailData(index, action); |
| | | break; |
| | | case ScrollerDataType.Extra1: |
| | | case ScrollerDataType.Extra2: |
| | | case ScrollerDataType.Extra3: |
| | | data = new ScrollerExtraData(index, type, action); |
| | | break; |
| | | } |
| | | if (data != null) { |
| | | data.info = info; |
| | | _data.Add(data); |
| | | } |
| | | } |
| | | |
| | | public void AddCell(ScrollerDataType type, int index, CellInfo info) |
| | | { |
| | | ScrollerData data = null; |
| | | switch (type) { |
| | | case ScrollerDataType.Header: |
| | | data = new ScrollerHeaderData(index); |
| | | break; |
| | | case ScrollerDataType.Normal: |
| | | data = new ScrollerNormalData(index); |
| | | break; |
| | | case ScrollerDataType.Tail: |
| | | data = new ScrollerTailData(index); |
| | | break; |
| | | case ScrollerDataType.Extra1: |
| | | case ScrollerDataType.Extra2: |
| | | case ScrollerDataType.Extra3: |
| | | data = new ScrollerExtraData(index, type); |
| | | break; |
| | | } |
| | | if (data != null) { |
| | | data.info = info; |
| | | _data.Add(data); |
| | | } |
| | | } |
| | | |
| | | public void OnRefreshAdd() |
| | | { |
| | | Restart(); |
| | | } |
| | | |
| | | public void Restart() |
| | | { |
| | | if (!inited) return; |
| | | |
| | | |
| | | m_Scorller.ReloadData(); |
| | | if (maxCellCnt != 0 && _data.Count <= maxCellCnt) |
| | | { |
| | | mScrollRect.horizontal = false; |
| | | mScrollRect.vertical = false; |
| | | } |
| | | else |
| | | { |
| | | mScrollRect.horizontal = horizontal; |
| | | mScrollRect.vertical = vertical; |
| | | } |
| | | |
| | | ResetScrollPos(); |
| | | |
| | | lastDataCnt = _data.Count; |
| | | } |
| | | |
| | | public void JumpIndex(int index) |
| | | { |
| | | if (!inited) |
| | | { |
| | | cacheJump = index; |
| | | return; |
| | | } |
| | | if ((index < 0 || index >= _data.Count) && !m_Scorller.Loop) return; |
| | | var _size = m_Scorller.GetScrollPositionForDataIndex(index, EnhancedScroller.CellViewPositionEnum.Before); |
| | | var _contentSize = vertical ? m_Scorller.scrollRect.content.rect.size.y : m_Scorller.scrollRect.content.rect.size.x; |
| | | if (_contentSize - _size < m_Scorller.ScrollRectSize) |
| | | { |
| | | _size = _contentSize - m_Scorller.ScrollRectSize; |
| | | } |
| | | m_Scorller.ScrollPosition = _size; |
| | | } |
| | | |
| | | public float GetCellSize(int _dataIndex) |
| | | { |
| | | if (!inited) |
| | | { |
| | | return 0; |
| | | } |
| | | return m_Scorller.GetCellSize(_dataIndex); |
| | | } |
| | | |
| | | public void JumpIndex(float _delta, float _time, EnhancedScroller.TweenType _tweenType) |
| | | { |
| | | if (!inited) |
| | | { |
| | | return; |
| | | } |
| | | m_Scorller.Tween(_tweenType, _time, m_Scorller.ScrollPosition + _delta); |
| | | } |
| | | |
| | | public float GetPreScrollSize(int index) |
| | | { |
| | | float _size = 0; |
| | | for (int i = 0; i < _data.Count; i++) { |
| | | _size += GetCellViewSize(m_Scorller, i); |
| | | if (i >= index) break; |
| | | } |
| | | return _size; |
| | | } |
| | | |
| | | public void RefreshSingleCellView(int _index) |
| | | { |
| | | CellView _cell; |
| | | if (IsDisplay(_index, out _cell)) |
| | | { |
| | | _cell.RefreshCellView(); |
| | | } |
| | | } |
| | | |
| | | public bool IsDisplay(int index, out CellView _cell) |
| | | { |
| | | _cell = null; |
| | | if (m_Scorller == null) |
| | | { |
| | | return false; |
| | | } |
| | | var _base = m_Scorller.GetActiveCellView(index); |
| | | if (_base != null) |
| | | { |
| | | _cell = _base as CellView; |
| | | return true; |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | public bool IsDisplay(int index) |
| | | { |
| | | if (m_Scorller == null) |
| | | { |
| | | return false; |
| | | } |
| | | return m_Scorller.GetActiveCellView(index) != null; |
| | | } |
| | | |
| | | public bool OutOfStartView(int index) |
| | | { |
| | | float value=m_Scorller.GetScrollPositionForCellViewIndex(index, EnhancedScroller.CellViewPositionEnum.Before); |
| | | if (value < m_Scorller.ScrollPosition) { |
| | | return true; |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | private void OnDestroy() |
| | | { |
| | | if (m_Scorller != null) |
| | | { |
| | | m_Scorller.OnFirstLoadAllEvent -= OnFirstLoadAllEvent; |
| | | } |
| | | } |
| | | |
| | | public void OnRebuildComplete() |
| | | { |
| | | if (OnRefreshCompleteEvent != null) |
| | | { |
| | | OnRefreshCompleteEvent(); |
| | | } |
| | | } |
| | | |
| | | #region 滚动定位 |
| | | |
| | | private EnhanceLockType m_lockType = EnhanceLockType.None; |
| | | |
| | | public EnhanceLockType lockType { |
| | | get { return m_lockType; } |
| | | set { |
| | | m_lockType = value; |
| | | } |
| | | } |
| | | |
| | | private float lastContentSize = 0; |
| | | |
| | | private int lastDataCnt = 0; |
| | | |
| | | private float lastScrollPos = 0; |
| | | |
| | | public void ResetScrollPos() |
| | | { |
| | | if (_data.Count == 0) |
| | | { |
| | | return; |
| | | } |
| | | switch (lockType) { |
| | | case EnhanceLockType.LockHorizonRight: { |
| | | mScrollRect.horizontalNormalizedPosition = 1; |
| | | } |
| | | break; |
| | | case EnhanceLockType.LockHorizonLeft: { |
| | | mScrollRect.horizontalNormalizedPosition = 0; |
| | | } |
| | | break; |
| | | case EnhanceLockType.LockVerticalTop: { |
| | | mScrollRect.verticalNormalizedPosition = 1; |
| | | } |
| | | break; |
| | | case EnhanceLockType.LockVerticalBottom: { |
| | | mScrollRect.verticalNormalizedPosition = 0; |
| | | m_Scorller.ScrollPosition = m_Scorller._ScrollSize; |
| | | } |
| | | break; |
| | | case EnhanceLockType.KeepHorizon: { |
| | | mScrollRect.horizontalNormalizedPosition = Mathf.Clamp01(lastContentSize * lastScrollPos / m_Scorller._ScrollSize); |
| | | } |
| | | break; |
| | | case EnhanceLockType.KeepVertical2: { |
| | | if(lastContentSize == m_Scorller._ScrollSize) { |
| | | mScrollRect.verticalNormalizedPosition = lastScrollPos; |
| | | m_Scorller.ScrollPosition = (1 - mScrollRect.verticalNormalizedPosition) * m_Scorller._ScrollSize; |
| | | return; |
| | | } |
| | | if (lastScrollPos == 1) { |
| | | mScrollRect.verticalNormalizedPosition = 1; |
| | | } |
| | | mScrollRect.verticalNormalizedPosition = Mathf.Clamp01(lastContentSize * lastScrollPos / m_Scorller._ScrollSize); |
| | | m_Scorller.ScrollPosition = (1 - mScrollRect.verticalNormalizedPosition) * m_Scorller._ScrollSize; |
| | | } |
| | | break; |
| | | case EnhanceLockType.KeepVertical: |
| | | { |
| | | if (lastContentSize == m_Scorller._ScrollSize) |
| | | { |
| | | mScrollRect.verticalNormalizedPosition = lastScrollPos; |
| | | m_Scorller.ScrollPosition = (1 - mScrollRect.verticalNormalizedPosition) * m_Scorller._ScrollSize; |
| | | return; |
| | | } |
| | | if (lastScrollPos == 1) |
| | | { |
| | | mScrollRect.verticalNormalizedPosition = 1; |
| | | } |
| | | mScrollRect.verticalNormalizedPosition = Mathf.Clamp01(1 - lastContentSize * (1 - lastScrollPos) / m_Scorller._ScrollSize); |
| | | m_Scorller.ScrollPosition = (1 - mScrollRect.verticalNormalizedPosition) * m_Scorller._ScrollSize; |
| | | } |
| | | break; |
| | | } |
| | | } |
| | | |
| | | #endregion |
| | | } |
| | | using System.Collections;
|
| | | using System.Collections.Generic;
|
| | | using UnityEngine;
|
| | | using EnhancedUI.EnhancedScroller;
|
| | | using System;
|
| | | using UnityEngine.UI;
|
| | | public enum EnhanceLockType
|
| | | {
|
| | | None,
|
| | | LockHorizonRight,
|
| | | LockHorizonLeft,
|
| | | LockVerticalTop,
|
| | | LockVerticalBottom,
|
| | | KeepHorizon,
|
| | | KeepVertical,
|
| | | KeepVertical2,
|
| | | }
|
| | | public class ScrollerController : MonoBehaviour, IEnhancedScrollerDelegate {
|
| | |
|
| | | private List<ScrollerData> _data = new List<ScrollerData>();
|
| | |
|
| | | public delegate void OnRefreshCellDelegate(ScrollerDataType type, CellView cell);
|
| | | public event OnRefreshCellDelegate OnRefreshCell;
|
| | |
|
| | | public delegate bool OnDynamicCell(ScrollerDataType type,int index,out float height);
|
| | | public event OnDynamicCell OnGetDynamicSize;
|
| | |
|
| | | public event Action OnRefreshCompleteEvent;
|
| | |
|
| | |
|
| | | public EnhancedScrollerCellView GetCellView(EnhancedScroller scroller, int dataIndex, int cellIndex)
|
| | | {
|
| | | CellView cell = GetCellView(scroller, dataIndex);
|
| | | if (!cell.gameObject.activeSelf) cell.gameObject.SetActive(true);
|
| | | cell.SetData(_data[dataIndex], _data[dataIndex].m_ScrollerType,this);
|
| | | if (_data[dataIndex].OnClick != null) {
|
| | | cell.OnClick = _data[dataIndex].OnClick;
|
| | | }
|
| | | cell.info = _data[dataIndex].info;
|
| | | if (OnRefreshCell != null) {
|
| | | OnRefreshCell(_data[dataIndex].m_ScrollerType, cell);
|
| | | }
|
| | | cell.RefreshUI();
|
| | | return cell;
|
| | | }
|
| | |
|
| | | private CellView GetCellView(EnhancedScroller scroller, int dataIndex)
|
| | | {
|
| | | CellView cell = null;
|
| | | switch (_data[dataIndex].m_ScrollerType) {
|
| | | case ScrollerDataType.Header:
|
| | | cell = scroller.GetCellView(m_CellHeaderPrefab) as CellView;
|
| | | break;
|
| | | case ScrollerDataType.Normal:
|
| | | cell = scroller.GetCellView(m_CellNomalPrefab) as CellView;
|
| | | break;
|
| | | case ScrollerDataType.Tail:
|
| | | cell = scroller.GetCellView(m_CellTailPrefab) as CellView;
|
| | | break;
|
| | | case ScrollerDataType.Extra1:
|
| | | cell = scroller.GetCellView(m_CellExtraPrefab1) as CellView;
|
| | | break;
|
| | | case ScrollerDataType.Extra2:
|
| | | cell = scroller.GetCellView(m_CellExtraPrefab2) as CellView;
|
| | | break;
|
| | | case ScrollerDataType.Extra3:
|
| | | cell = scroller.GetCellView(m_CellExtraPrefab3) as CellView;
|
| | | break;
|
| | | }
|
| | | return cell;
|
| | | }
|
| | |
|
| | | public float GetCellViewSize(EnhancedScroller scroller, int dataIndex)
|
| | | {
|
| | | if (OnGetDynamicSize != null) {
|
| | | float height = 0;
|
| | | if (OnGetDynamicSize(_data[dataIndex].m_ScrollerType, _data[dataIndex].index,out height)) {
|
| | | return height;
|
| | | }
|
| | | }
|
| | | switch (_data[dataIndex].m_ScrollerType) {
|
| | | case ScrollerDataType.Header:
|
| | | return m_CellHeaderPrefab.height;
|
| | | case ScrollerDataType.Normal:
|
| | | return m_CellNomalPrefab.height;
|
| | | case ScrollerDataType.Tail:
|
| | | return m_CellTailPrefab.height;
|
| | | case ScrollerDataType.Extra1:
|
| | | return m_CellExtraPrefab1.height;
|
| | | case ScrollerDataType.Extra2:
|
| | | return m_CellExtraPrefab2.height;
|
| | | case ScrollerDataType.Extra3:
|
| | | return m_CellExtraPrefab3.height;
|
| | | }
|
| | | return 80;
|
| | | }
|
| | |
|
| | | public void OnRefreshCellActive(CellView cell)
|
| | | {
|
| | | if (OnRefreshCell != null) {
|
| | | OnRefreshCell(cell.type, cell);
|
| | | }
|
| | | }
|
| | |
|
| | | public int GetNumberOfCells(EnhancedScroller scroller)
|
| | | {
|
| | | return _data.Count;
|
| | | }
|
| | |
|
| | | public EnhancedScroller m_Scorller;
|
| | | private ScrollRect m_ScrollRect;
|
| | | public ScrollRect mScrollRect {
|
| | | get {
|
| | | if (m_ScrollRect == null)
|
| | | m_ScrollRect = m_Scorller.GetComponent<ScrollRect>();
|
| | | return m_ScrollRect;
|
| | | }
|
| | | }
|
| | | public CellView m_CellHeaderPrefab;
|
| | | public CellView m_CellNomalPrefab;
|
| | | public CellView m_CellTailPrefab;
|
| | | public CellView m_CellExtraPrefab1;
|
| | | public CellView m_CellExtraPrefab2;
|
| | | public CellView m_CellExtraPrefab3;
|
| | | public int maxCellCnt = 0;
|
| | |
|
| | | public bool horizontal = false;
|
| | | public bool vertical = false;
|
| | | private bool inited = false;
|
| | | private int cacheJump = -1;
|
| | | private void Awake()
|
| | | {
|
| | | m_Scorller.Delegate = this;
|
| | | horizontal = mScrollRect.horizontal;
|
| | | vertical = mScrollRect.vertical;
|
| | |
|
| | | inited = m_Scorller.inited;
|
| | | m_Scorller.OnFirstLoadAllEvent += OnFirstLoadAllEvent;
|
| | | if (m_Scorller.OnCompLoad == null && !m_Scorller.inited)
|
| | | {
|
| | | m_Scorller.OnCompLoad = OnCompLoad;
|
| | | }
|
| | | HideDefaultCell();
|
| | | }
|
| | |
|
| | | private void OnFirstLoadAllEvent()
|
| | | {
|
| | | if (cacheJump != -1)
|
| | | {
|
| | | JumpIndex(cacheJump);
|
| | | }
|
| | | }
|
| | |
|
| | | private void HideDefaultCell()
|
| | | {
|
| | | HideDefaultCell(m_CellHeaderPrefab);
|
| | | HideDefaultCell(m_CellNomalPrefab);
|
| | | HideDefaultCell(m_CellTailPrefab);
|
| | | HideDefaultCell(m_CellExtraPrefab1);
|
| | | HideDefaultCell(m_CellExtraPrefab2);
|
| | | HideDefaultCell(m_CellExtraPrefab3);
|
| | | }
|
| | |
|
| | | private void HideDefaultCell(CellView _cell)
|
| | | {
|
| | | if (_cell != null)
|
| | | {
|
| | | _cell.gameObject.SetActive(false);
|
| | | }
|
| | | }
|
| | |
|
| | | List<CellView> list = new List<CellView>();
|
| | |
|
| | | private void OnCompLoad()
|
| | | {
|
| | | inited = true;
|
| | | if (_data.Count > 0)
|
| | | {
|
| | | Restart();
|
| | | }
|
| | | }
|
| | |
|
| | | public void Refresh()
|
| | | {
|
| | | inited = m_Scorller.inited;
|
| | | if (m_Scorller.OnCompLoad == null && !m_Scorller.inited)
|
| | | {
|
| | | m_Scorller.OnCompLoad = OnCompLoad;
|
| | | }
|
| | | _data.Clear();
|
| | |
|
| | | if (!inited)
|
| | | {
|
| | | return;
|
| | | }
|
| | |
|
| | | if(m_Scorller.LayoutGroup != null)
|
| | | {
|
| | | m_Scorller.LayoutGroup.spacing = m_Scorller.spacing;
|
| | | }
|
| | |
|
| | | lastScrollPos = horizontal ? mScrollRect.horizontalNormalizedPosition : mScrollRect.verticalNormalizedPosition;
|
| | | lastContentSize = m_Scorller._ScrollSize;
|
| | |
|
| | | mScrollRect.verticalNormalizedPosition = 1;
|
| | | mScrollRect.horizontalNormalizedPosition = 0;
|
| | |
|
| | | lastScrollPos = Mathf.Clamp01(lastScrollPos);
|
| | |
|
| | | }
|
| | |
|
| | | public CellView GetActiveCellView(int _index)
|
| | | {
|
| | | if (m_Scorller == null)
|
| | | {
|
| | | return null;
|
| | | }
|
| | | var _cellView = m_Scorller.GetActiveCellView(_index);
|
| | | if (_cellView != null)
|
| | | {
|
| | | return _cellView as CellView;
|
| | | }
|
| | | return null;
|
| | | }
|
| | |
|
| | | public void AddCell(ScrollerDataType type, int index, Action<CellView> action = null, CellInfo? info = null)
|
| | | {
|
| | | ScrollerData data = null;
|
| | | switch (type) {
|
| | | case ScrollerDataType.Header:
|
| | | data = new ScrollerHeaderData(index, action);
|
| | | break;
|
| | | case ScrollerDataType.Normal:
|
| | | data = new ScrollerNormalData(index, action);
|
| | | break;
|
| | | case ScrollerDataType.Tail:
|
| | | data = new ScrollerTailData(index, action);
|
| | | break;
|
| | | case ScrollerDataType.Extra1:
|
| | | case ScrollerDataType.Extra2:
|
| | | case ScrollerDataType.Extra3:
|
| | | data = new ScrollerExtraData(index, type, action);
|
| | | break;
|
| | | }
|
| | | if (data != null) {
|
| | | data.info = info;
|
| | | _data.Add(data);
|
| | | }
|
| | | }
|
| | |
|
| | | public void AddCell(ScrollerDataType type, int index, CellInfo info)
|
| | | {
|
| | | ScrollerData data = null;
|
| | | switch (type) {
|
| | | case ScrollerDataType.Header:
|
| | | data = new ScrollerHeaderData(index);
|
| | | break;
|
| | | case ScrollerDataType.Normal:
|
| | | data = new ScrollerNormalData(index);
|
| | | break;
|
| | | case ScrollerDataType.Tail:
|
| | | data = new ScrollerTailData(index);
|
| | | break;
|
| | | case ScrollerDataType.Extra1:
|
| | | case ScrollerDataType.Extra2:
|
| | | case ScrollerDataType.Extra3:
|
| | | data = new ScrollerExtraData(index, type);
|
| | | break;
|
| | | }
|
| | | if (data != null) {
|
| | | data.info = info;
|
| | | _data.Add(data);
|
| | | }
|
| | | }
|
| | |
|
| | | public void OnRefreshAdd()
|
| | | {
|
| | | Restart();
|
| | | }
|
| | |
|
| | | public void Restart()
|
| | | {
|
| | | if (!inited) return;
|
| | |
|
| | |
|
| | | m_Scorller.ReloadData();
|
| | | if (maxCellCnt != 0 && _data.Count <= maxCellCnt)
|
| | | {
|
| | | mScrollRect.horizontal = false;
|
| | | mScrollRect.vertical = false;
|
| | | }
|
| | | else
|
| | | {
|
| | | mScrollRect.horizontal = horizontal;
|
| | | mScrollRect.vertical = vertical;
|
| | | }
|
| | |
|
| | | ResetScrollPos();
|
| | |
|
| | | lastDataCnt = _data.Count;
|
| | | }
|
| | |
|
| | | public void JumpIndex(int index)
|
| | | {
|
| | | if (!inited)
|
| | | {
|
| | | cacheJump = index;
|
| | | return;
|
| | | }
|
| | | if ((index < 0 || index >= _data.Count) && !m_Scorller.Loop) return;
|
| | | var _size = m_Scorller.GetScrollPositionForDataIndex(index, EnhancedScroller.CellViewPositionEnum.Before);
|
| | | var _contentSize = vertical ? m_Scorller.scrollRect.content.rect.size.y : m_Scorller.scrollRect.content.rect.size.x;
|
| | | if (_contentSize - _size < m_Scorller.ScrollRectSize)
|
| | | {
|
| | | _size = _contentSize - m_Scorller.ScrollRectSize;
|
| | | }
|
| | | m_Scorller.ScrollPosition = _size;
|
| | | }
|
| | |
|
| | | public float GetCellSize(int _dataIndex)
|
| | | {
|
| | | if (!inited)
|
| | | {
|
| | | return 0;
|
| | | }
|
| | | return m_Scorller.GetCellSize(_dataIndex);
|
| | | }
|
| | |
|
| | | public void JumpIndex(float _delta, float _time, EnhancedScroller.TweenType _tweenType)
|
| | | {
|
| | | if (!inited)
|
| | | {
|
| | | return;
|
| | | }
|
| | | m_Scorller.Tween(_tweenType, _time, m_Scorller.ScrollPosition + _delta);
|
| | | }
|
| | |
|
| | | public float GetPreScrollSize(int index)
|
| | | {
|
| | | float _size = 0;
|
| | | for (int i = 0; i < _data.Count; i++) {
|
| | | _size += GetCellViewSize(m_Scorller, i);
|
| | | if (i >= index) break;
|
| | | }
|
| | | return _size;
|
| | | }
|
| | |
|
| | | public void RefreshSingleCellView(int _index)
|
| | | {
|
| | | CellView _cell;
|
| | | if (IsDisplay(_index, out _cell))
|
| | | {
|
| | | _cell.RefreshCellView();
|
| | | }
|
| | | }
|
| | |
|
| | | public bool IsDisplay(int index, out CellView _cell)
|
| | | {
|
| | | _cell = null;
|
| | | if (m_Scorller == null)
|
| | | {
|
| | | return false;
|
| | | }
|
| | | var _base = m_Scorller.GetActiveCellView(index);
|
| | | if (_base != null)
|
| | | {
|
| | | _cell = _base as CellView;
|
| | | return true;
|
| | | }
|
| | | return false;
|
| | | }
|
| | |
|
| | | public bool IsDisplay(int index)
|
| | | {
|
| | | if (m_Scorller == null)
|
| | | {
|
| | | return false;
|
| | | }
|
| | | return m_Scorller.GetActiveCellView(index) != null;
|
| | | }
|
| | |
|
| | | public bool OutOfStartView(int index)
|
| | | {
|
| | | float value=m_Scorller.GetScrollPositionForCellViewIndex(index, EnhancedScroller.CellViewPositionEnum.Before);
|
| | | if (value < m_Scorller.ScrollPosition) {
|
| | | return true;
|
| | | }
|
| | | return false;
|
| | | }
|
| | |
|
| | | private void OnDestroy()
|
| | | {
|
| | | if (m_Scorller != null)
|
| | | {
|
| | | m_Scorller.OnFirstLoadAllEvent -= OnFirstLoadAllEvent;
|
| | | }
|
| | | }
|
| | |
|
| | | public void OnRebuildComplete()
|
| | | {
|
| | | if (OnRefreshCompleteEvent != null)
|
| | | {
|
| | | OnRefreshCompleteEvent();
|
| | | }
|
| | | }
|
| | |
|
| | | #region 滚动定位
|
| | |
|
| | | private EnhanceLockType m_lockType = EnhanceLockType.None;
|
| | |
|
| | | public EnhanceLockType lockType {
|
| | | get { return m_lockType; }
|
| | | set {
|
| | | m_lockType = value;
|
| | | }
|
| | | }
|
| | |
|
| | | private float lastContentSize = 0;
|
| | |
|
| | | private int lastDataCnt = 0;
|
| | |
|
| | | private float lastScrollPos = 0;
|
| | |
|
| | | public void ResetScrollPos()
|
| | | {
|
| | | if (_data.Count == 0)
|
| | | {
|
| | | return;
|
| | | }
|
| | | switch (lockType) {
|
| | | case EnhanceLockType.LockHorizonRight: {
|
| | | mScrollRect.horizontalNormalizedPosition = 1;
|
| | | }
|
| | | break;
|
| | | case EnhanceLockType.LockHorizonLeft: {
|
| | | mScrollRect.horizontalNormalizedPosition = 0;
|
| | | }
|
| | | break;
|
| | | case EnhanceLockType.LockVerticalTop: {
|
| | | mScrollRect.verticalNormalizedPosition = 1;
|
| | | }
|
| | | break;
|
| | | case EnhanceLockType.LockVerticalBottom: {
|
| | | mScrollRect.verticalNormalizedPosition = 0;
|
| | | m_Scorller.ScrollPosition = m_Scorller._ScrollSize;
|
| | | }
|
| | | break;
|
| | | case EnhanceLockType.KeepHorizon: {
|
| | | mScrollRect.horizontalNormalizedPosition = Mathf.Clamp01(lastContentSize * lastScrollPos / m_Scorller._ScrollSize);
|
| | | }
|
| | | break;
|
| | | case EnhanceLockType.KeepVertical2: {
|
| | | if(lastContentSize == m_Scorller._ScrollSize) {
|
| | | mScrollRect.verticalNormalizedPosition = lastScrollPos;
|
| | | m_Scorller.ScrollPosition = (1 - mScrollRect.verticalNormalizedPosition) * m_Scorller._ScrollSize;
|
| | | return;
|
| | | }
|
| | | if (lastScrollPos == 1) {
|
| | | mScrollRect.verticalNormalizedPosition = 1;
|
| | | }
|
| | | mScrollRect.verticalNormalizedPosition = Mathf.Clamp01(lastContentSize * lastScrollPos / m_Scorller._ScrollSize);
|
| | | m_Scorller.ScrollPosition = (1 - mScrollRect.verticalNormalizedPosition) * m_Scorller._ScrollSize;
|
| | | }
|
| | | break;
|
| | | case EnhanceLockType.KeepVertical:
|
| | | {
|
| | | if (lastContentSize == m_Scorller._ScrollSize)
|
| | | {
|
| | | mScrollRect.verticalNormalizedPosition = lastScrollPos;
|
| | | m_Scorller.ScrollPosition = (1 - mScrollRect.verticalNormalizedPosition) * m_Scorller._ScrollSize;
|
| | | return;
|
| | | }
|
| | | if (lastScrollPos == 1)
|
| | | {
|
| | | mScrollRect.verticalNormalizedPosition = 1;
|
| | | }
|
| | | mScrollRect.verticalNormalizedPosition = Mathf.Clamp01(1 - lastContentSize * (1 - lastScrollPos) / m_Scorller._ScrollSize);
|
| | | m_Scorller.ScrollPosition = (1 - mScrollRect.verticalNormalizedPosition) * m_Scorller._ScrollSize;
|
| | | }
|
| | | break;
|
| | | }
|
| | | }
|
| | |
|
| | | #endregion
|
| | | }
|