protected override void RollView(LoopViewShowDirection direction) { if (direction == LoopViewShowDirection.None || (int)direction > (int)LoopViewShowDirection.Left) { Debug.LogError("RollViewEx Fail,direction= " + direction); return; } ContentViewShowDirection = Direction = direction; }
public virtual void RollView(LoopViewShowDirection direction, float endPosX, float tweenTime, bool isAbsDistance = false, System.Action completeRoll = null) { if (direction == LoopViewShowDirection.None || (int)direction < (int)LoopViewShowDirection.Left) { Debug.LogError("RollViewEx Fail,direction= " + direction); return; } if (IsScrolling) { return; } if (isAbsDistance == false) { endPosX += ContentRectrans.anchoredPosition.x; } #region 检测数值 避免由于滑动的太远太快导致视图显示异常 2019/4/23 新增 float offset = endPosX - ContentRectrans.anchoredPosition.x; if (Mathf.Abs(offset) / tweenTime * Time.deltaTime >= ViewRectHalfSize) { Debug.LogError("滑动的距离太远且时间太短 导致视图异常 " + offset); return; } #endregion if (CheckContentOffsetAvailable(direction, endPosX) == false) { return; } RollView(direction); if (ContentRectrans.anchoredPosition.x == endPosX) { UpdateItemState(); OnCompleteScrollView(); return; } OnBeginScrollView(); if (completeRoll != null) { ContentRectrans.DOAnchorPosX(endPosX, tweenTime).OnUpdate(UpdateItemState).OnComplete(() => { OnCompleteScrollView(); if (completeRoll != null) { completeRoll.Invoke(); } }).SetEase(mTweenAnimationCurve); } else { ContentRectrans.DOAnchorPosX(endPosX, tweenTime).OnUpdate(UpdateItemState).OnComplete(OnCompleteScrollView).SetEase(mTweenAnimationCurve); } }
/// <summary> /// 滑动指定固定间隔 指定偏移的距离 /// </summary> /// <param name="direction"></param> /// <param name="offsetItem">移动多少个ItemDistance</param> /// <param name="tweenTime"></param> /// <param name="isAbsDistance"></param> public void RollViewEx(LoopViewShowDirection direction, int offsetItem, float tweenTime, bool isAbsDistance, System.Action completeRoll = null) { if (direction == LoopViewShowDirection.None || (int)direction < (int)LoopViewShowDirection.Left) { Debug.LogError("RollViewEx Fail,direction= " + direction); return; } offsetItem = GetContentOffset(direction, offsetItem); RollView(direction, offsetItem * ItemDistance, tweenTime, isAbsDistance, completeRoll); }
/// <summary> /// 检测偏移的参数是否合法 2019/4/24 新增 /// </summary> /// <param name="direction"></param> /// <param name="endPos"></param> /// <returns></returns> protected bool CheckContentOffsetAvailable(LoopViewShowDirection direction, float endPos) { float offset = 0; switch (direction) { case LoopViewShowDirection.Down: offset = endPos - ContentRectrans.anchoredPosition.y; if (offset < 0) { Debug.LogError("显示下面的内容的偏移要大于0"); return(false); } break; case LoopViewShowDirection.Up: offset = endPos - ContentRectrans.anchoredPosition.y; if (offset > 0) { Debug.LogError("显示上面的内容的偏移要小于0"); return(false); } break; case LoopViewShowDirection.Left: offset = endPos - ContentRectrans.anchoredPosition.x; if (offset < 0) { Debug.LogError("显示左边的内容的偏移要大于0"); return(false); } break; case LoopViewShowDirection.Right: offset = endPos - ContentRectrans.anchoredPosition.x; if (offset > 0) { Debug.LogError("显示右边的内容的偏移要小于0"); return(false); } break; default: Debug.LogError("没有定义视图显示方向" + direction); return(false); } return(true); }
/// <summary> /// 根据视图显示的方向修正数据 (修正数据 2019/4/23 新增 ) /// </summary> /// <param name="direction"></param> /// <param name="offsetItem"></param> /// <returns></returns> protected int GetContentOffset(LoopViewShowDirection direction, int offsetItem) { int realOffset = offsetItem; switch (direction) { case LoopViewShowDirection.Down: if (realOffset < 0) { Debug.LogError("显示下面的视图 偏移应该为大于0"); realOffset *= -1; } break; case LoopViewShowDirection.Up: if (realOffset > 0) { Debug.LogError("显示上面的视图 偏移应该为小于0"); realOffset *= -1; } break; case LoopViewShowDirection.Left: if (realOffset < 0) { Debug.LogError("显示左边的视图 偏移应该为大于0"); realOffset *= -1; } break; case LoopViewShowDirection.Right: if (realOffset > 0) { Debug.LogError("显示右边的视图 偏移应该为小于0"); realOffset *= -1; } break; default: Debug.LogError("没有定义的类型 " + direction); break; } return(realOffset); }
/// <summary> /// 当数据不足 不能无限循环时候的滑动 只能滑动到边界 /// </summary> /// <returns></returns> protected float CaculateMaxOffsetDistance(LoopViewShowDirection direction) { if (DateCount <= 1) { return(0); } float absDistance = ItemDistance * (DateCount * 0.5f); if (direction == LoopViewShowDirection.Up) { absDistance = -1 * absDistance; } if (CheckContentOffsetAvailable(direction, absDistance) == false) { return(0); } return(absDistance); }
public override void RollView(LoopViewShowDirection direction, float endPosx, float tweenTime, bool isAbsDistance, System.Action completeRoll = null) { if (direction == LoopViewShowDirection.None || (int)direction < (int)LoopViewShowDirection.Left) { Debug.LogError("RollViewEx Fail,direction= " + direction); return; } if (IsScrolling) { return; } ContentViewShowDirection = direction; if (isAbsDistance == false) { endPosx += ContentRectrans.anchoredPosition.x; } if (CheckContentOffsetAvailable(direction, endPosx) == false) { return; } // Debug.Log("------------" + endPosx + " " + direction); if (IsLoopCircleModel) { #region 可以循环滑动 RollView(direction); if (ContentRectrans.anchoredPosition.x == endPosx) { UpdateItemState(); OnCompleteScrollView(); return; } OnBeginScrollView(); if (completeRoll == null) { MoveTweenner = ContentRectrans.DOAnchorPosX(endPosx, tweenTime).OnUpdate(OnUpdateTweenView).OnComplete(OnCompleteScrollView).SetEase(mTweenAnimationCurve); } else { MoveTweenner = ContentRectrans.DOAnchorPosX(endPosx, tweenTime).OnUpdate(OnUpdateTweenView).OnComplete(() => { OnCompleteScrollView(); completeRoll(); }).SetEase(mTweenAnimationCurve); } #endregion return; } #region 数据不足以循环时候只显示一页 float maxOffset = CaculateMaxOffsetDistance(direction); // Debug.Log("maxOffset=" + maxOffset); if (mLastRecordContentAnchoePos.x == ContentInitialedPos.x + maxOffset) { if (completeRoll != null) { completeRoll.Invoke(); } return; //已经达到边界 } float realEndPosx = 0; if (Mathf.Abs(endPosx) < Mathf.Abs(maxOffset)) { realEndPosx = endPosx; } else { realEndPosx = maxOffset; } if (realEndPosx == ContentRectrans.anchoredPosition.x) { if (completeRoll != null) { completeRoll.Invoke(); } return; } if (CheckContentOffsetAvailable(direction, realEndPosx) == false) { return; } IsScrolling = true; if (completeRoll != null) { MoveTweenner = ContentRectrans.DOAnchorPosX(realEndPosx, tweenTime).OnUpdate(OnUpdateTweenView).OnComplete(() => { OnCompleteScrollView(); completeRoll(); }).SetEase(mTweenAnimationCurve); } else { MoveTweenner = ContentRectrans.DOAnchorPosX(realEndPosx, tweenTime).OnUpdate(OnUpdateTweenView).OnComplete(OnCompleteScrollView).SetEase(mTweenAnimationCurve); } #endregion }
/// <summary> /// 滑动视图 /// </summary> /// <param name="direction"></param> protected abstract void RollView(LoopViewShowDirection direction);