Пример #1
0
    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);
    }