/// <summary> /// 删除所有的数据 /// </summary> /// <param name="isDeleteShowingItems">=true 标示立刻删除所有的项,=false 则标示显示完之后再删除</param> public virtual void ClearAllContentItem(bool isDeleteShowingItems) { RececlyMessageItems(); mAllContentInfors.Clear(); mAllShowingContentMessageItem.Clear(); mAllRecycleMessage.Clear(); mWillShowContent = null; mLastShowContenItem = null; }
public virtual void ShowMessage(LoopContentItemInfor itemInfor, bool isEnableAfterShow) { if (itemInfor == null) { return; } ++MessageID; LoopContentItemInfor infor = new LoopContentItemInfor(itemInfor, MessageID, isEnableAfterShow); mAllContentInfors.Add(infor); }
///// <summary> ///// 获取上一个显示的内容 ///// </summary> ///// <param name="current"></param> ///// <returns></returns> //private LoopContentItemInfor GetPreviousShowContentItem(LoopContentItemInfor current) //{ // if (mAllContentInfors.Count == 0) // return null; // for (int dex = 0; dex < mAllContentInfors.Count; dex++) // { // if (mAllContentInfors[dex].mMessageID == current.mMessageID) // { // if (dex != 0) // return mAllContentInfors[dex - 1]; // return null; // } // } // return null; //} //private LoopContentItemInfor GetFirstShowContentItem(ref Queue<LoopContentItemInfor> dataSorces) //{ // if (dataSorces == null || dataSorces.Count == 0) // return null; // return dataSorces.Dequeue(); //} #endregion #region 对外接口 /// <summary> /// 添加一个要显示的内容 /// </summary> /// <param name="msg"></param> /// <param name="isEnableAfterShow">是否只显示一次</param> public virtual void ShowMessage(string msg, bool isEnableAfterShow) { if (string.IsNullOrEmpty(msg)) { return; } ++MessageID; LoopContentItemInfor itemInfor = new LoopContentItemInfor(msg, MessageID, isEnableAfterShow); mAllContentInfors.Add(itemInfor); }
public LoopContentItemInfor(LoopContentItemInfor infor, int messageID, bool isEnableAfterShow) { mMessageID = messageID; mContentMessage = infor.mContentMessage; mIsEnableAfterShow = isEnableAfterShow; }
protected virtual bool DoLoopShowContent() { if (mViewMaskRectTrans.childCount >= mMaxShowingItemCount) { return(false); } mWillShowContent = GetNextShowContentItem(); if (mWillShowContent == null) { return(false); } mAllContentInfors.RemoveAt(0); UILanternMessageItem tempLastMessageItem = mLastShowContenItem; //使用临时变量避免修改原有的引用 // EditorPauseApplication.Pause(); if (tempLastMessageItem == null && mViewMaskRectTrans.childCount > 0) { tempLastMessageItem = mViewMaskRectTrans.GetChild(mViewMaskRectTrans.childCount - 1).GetComponent <UILanternMessageItem>(); } float endAnchorPos = 0, tweenTime = 0; UILanternMessageItem viewItem = GetMeessageItem(); viewItem.ShowContent(mWillShowContent); if (tempLastMessageItem != null) { Rect LastShowTargetRect = tempLastMessageItem.rectTransform.GetCanvasRect_Standard(mCanvas); if (LastShowTargetRect.x + LastShowTargetRect.width >= mViewMaskRect.x + mViewMaskRect.width - mContentItemSpace) //这里-mContentItemSpace 为了确保两个项之间的距离最小是mContentItemSpace { // Debug.Log("上一个记录很长 超过Mask区域 则下一个消息接在这个消息后面 " + mLastShowContenItem.rectTransform.anchoredPosition.x); viewItem.rectTransform.anchoredPosition = new Vector2(tempLastMessageItem.rectTransform.anchoredPosition.x + tempLastMessageItem.rectTransform.rect.width + mContentItemSpace, 0); } //上一个记录很长 超过Mask区域 则下一个消息接在这个消息后面 else { viewItem.rectTransform.anchoredPosition = new Vector2(mViewMaskRectTrans.rect.width, 0); } //在显示区域的右边开始 } else { viewItem.rectTransform.anchoredPosition = new Vector2(mViewMaskRectTrans.rect.width, 0); } endAnchorPos = -1 * viewItem.mWidth - mContentItemSpace; //防止边界问题 每个消息多位移一点点 mLastShowContenItem = viewItem; tweenTime = mBaseTweenTime * Mathf.Abs(endAnchorPos - viewItem.rectTransform.anchoredPosition.x) / mBaseTweenDistance; Tweener tween = viewItem.rectTransform.DOAnchorPosX(endAnchorPos, tweenTime).SetEase(Ease.Linear).OnComplete(() => { Rect viewTargetRect = viewItem.rectTransform.GetCanvasRect_Standard(mCanvas); Rect mViewMaskRect = mViewMaskRectTrans.GetCanvasRect_Standard(mCanvas); if (mViewMaskRect.Overlaps(viewTargetRect) == false) { // Debug.Log("OnCompleteLastTween Recycle " + viewItem.gameObject.name); if (mAllShowingContentMessageItem.Count > 0) { if (mAllShowingContentMessageItem.Peek() != viewItem) { Debug.Log("保存的数据记录与存在的不对应 "); //当调用了ClearAllContentItem 接口后,由于没有删除已经存在的消息 这里可能不一致 } else { mAllShowingContentMessageItem.Dequeue(); } } DeleteMeessageItem(viewItem, true); } if (OnCompleteTweenCallback != null) { OnCompleteTweenCallback(viewItem); } }); viewItem.SetTweener(tween); mAllShowingContentMessageItem.Enqueue(viewItem); return(true); }