示例#1
0
    private void OnDragFinished()
    {
        var dragOffset = mPanel.clipOffset.x - panelStartOffset;

        //拖动方向
        mFinisedSvDragDir    = dragOffset > 0 ? DragmoveDir.Left : dragOffset < 0 ? DragmoveDir.Right : DragmoveDir.None;
        intFinishedSvDragDir = mFinisedSvDragDir == DragmoveDir.Left ? 1 : mFinisedSvDragDir == DragmoveDir.Right ? -1 : 0;
        //Debug.LogError("Drag:" + mFinisedSvDragDir);

        #region 跳转页下标,页位置计算
        var pageNum = 0;
        var goToNextPageDistance = pageColumnLimit * cellSize;
        var offsetDistance       = Mathf.Abs((int)(mPanel.clipOffset.x - panelStartOffset));
        if (mMovement == UIScrollView.Movement.Horizontal)
        {
            pageNum = (offsetDistance / goToNextPageDistance) + 1;
            pageNum = offsetDistance >= goToNextPageDistance + goToNextPageDistance / 2 ? pageNum - 1 : pageNum;
        }

        var dragDistance = Mathf.Abs(dragOffset);
        int willGotoPageIndex;
        if (dragDistance >= minDragMoveDistance)// 限制1:翻页的最短距离限制
        {
            if (mFinisedSvDragDir == DragmoveDir.Left)
            {
                willGotoPageIndex = curPageIndex + pageNum;
                if (IsNeedFirstLastLimit && willGotoPageIndex >= pageTotalNum)//限制2:首尾翻页限制
                {
                    Extensions.LogAttentionTip(string.Format("当前第{0}页,不支持左拖翻页到{1}", curPageIndex, willGotoPageIndex));
                    willGotoPageIndex = pageTotalNum - 1;
                }
                curPageIndex = willGotoPageIndex;
            }
            if (mFinisedSvDragDir == DragmoveDir.Right)
            {
                willGotoPageIndex = curPageIndex - pageNum;


                if (IsNeedFirstLastLimit && willGotoPageIndex < 0) //限制2:首尾翻页限制
                {
                    Extensions.LogAttentionTip(string.Format("当前第{0}页,不支持右拖翻页{1}", curPageIndex, willGotoPageIndex));
                    willGotoPageIndex = 0;
                }
                curPageIndex = willGotoPageIndex;
            }
        }
        else
        {
            Extensions.LogAttentionTip(string.Format("拖动距离{0}太短,不足以翻页", dragDistance));
        }
        //Debug.LogError(curPageIndex);


        var finalmoveTo = -1 * curPageIndex * pageColumnLimit * cellSize;
        SpringPanel.Begin(mPanel.gameObject, new Vector3(finalmoveTo, 0, 0), 8f);

        #endregion
        //移动方向
        mFinisedSvMoveDir    = mPanel.transform.localPosition.x - finalmoveTo > 0 ? DragmoveDir.Left : mPanel.transform.localPosition.x - finalmoveTo < 0 ? DragmoveDir.Right : DragmoveDir.None;
        intFinishedSvMoveDir = mFinisedSvMoveDir == DragmoveDir.Left ? 1 : mFinisedSvMoveDir == DragmoveDir.Right ? -1 : 0;
        //Debug.LogError("Move:" + mFinisedSvMoveDir);
        //Debug.LogError("Move int:" + intFinishedSvMoveDir);

        //CheckMove();
    }
    /// <summary>
    /// 检测并移动
    /// </summary>
    private void CheckCellMove()
    {
        int rowLimit  = mMovement == UIScrollView.Movement.Vertical ? mPanelRowLimit + extraShowNum : mPanelRowLimit;
        int lineLimit = mMovement == UIScrollView.Movement.Horizontal ? mPanelColumnLimit + extraShowNum : mPanelColumnLimit;

        if (cellGoList.Count <= lineLimit)
        {
            return;
        }

        int curLastColIndex, curLastShowDateColIndex;
        int cellIndex, moveColIndex, dataIndex = 0;

        bool  isCanMove = true;
        float cellX     = 0;

        if (mMovement == UIScrollView.Movement.Horizontal)
        {
            curFirstColIndex = curFirstColIndex % lineLimit;
            curLastColIndex  = (curFirstColIndex + lineLimit - 1) % lineLimit;

            curFirstShowDataColIndex = curFirstShowDataColIndex % mDataColumnLimit;
            curLastShowDateColIndex  = (curFirstShowDataColIndex + mPanelColumnLimit) % mDataColumnLimit;

            int         moveDir = mPanel.clipOffset.x - panelStartOffset > 0 ? 1 : mPanel.clipOffset.x - panelStartOffset < 0 ? -1 : 0;
            DragmoveDir dragDir = moveDir == 1 ? DragmoveDir.Left : moveDir == -1 ? DragmoveDir.Right : DragmoveDir.None;
            if (dragDir == DragmoveDir.None)
            {
                return;
            }

            //需要移动的列index
            moveColIndex = dragDir == DragmoveDir.Left ? curFirstColIndex : dragDir == DragmoveDir.Right ? curLastColIndex : -1;

            cellX = cellGoList[moveColIndex].transform.localPosition.x;
            cellX = cellX - mPanel.clipOffset.x;
            //左拖动 offset变大 cell右移 x增加
            if (IsAllOutHoriPanel(cellX))
            {
                for (int hangIndex = 0; hangIndex < rowLimit; hangIndex++)
                {
                    cellIndex = hangIndex * lineLimit + moveColIndex;
                    cellX     = cellGoList[cellIndex].transform.localPosition.x + moveDir * lineLimit * cellSize;

                    if (dragDir == DragmoveDir.Left)
                    {
                        dataIndex = curLastShowDateColIndex + extraShowNum;
                        if (dataIndex >= mDataColumnLimit) //到尾限制
                        {
                            return;
                        }
                    }
                    else if (dragDir == DragmoveDir.Right)
                    {
                        dataIndex = curFirstShowDataColIndex - extraShowNum;
                        if (dataIndex < 0) //到头限制
                        {
                            return;
                        }
                    }
                    dataIndex = hangIndex * mDataColumnLimit + dataIndex;
                    onUpdateItem(cellGoList[cellIndex], dataIndex);
                    cellGoList[cellIndex].transform.SetLocalX(cellX);
                }

                if (dragDir == DragmoveDir.Left)
                {
                    curFirstShowDataColIndex++;
                    curFirstColIndex++;
                }
                else if (dragDir == DragmoveDir.Right)
                {
                    curFirstShowDataColIndex--;
                    curFirstColIndex = curLastColIndex;
                }
            }
        }
        if (mMovement == UIScrollView.Movement.Vertical)
        {
            //todo
        }
    }