Пример #1
0
    public void Init()
    {
        _canChangeCenterItem = true;
        int useItemCount = showItemCountInView * _dataLengthMul;

        // 乘1万再除以1万的方式,就是为了保留4位小数
        _factor = (Mathf.RoundToInt((1f / useItemCount) * 10000f)) * 0.0001f;
        _totalHorizontalWidth = useItemCount * itemSpacingWidth;
        _oriListCenterIndex   = useItemCount / 2;
        if (useItemCount % 2 == 0)
        {
            _oriListCenterIndex = useItemCount / 2 - 1;
        }
        itemTemplate.SetActive(true);
        for (int i = 0; i < useItemCount; i++)
        {
            GameObject go = Instantiate(itemTemplate);
            go.name = i.ToString();
            go.transform.SetParent(_tr);
            go.transform.localPosition = new Vector3(_factor * i * _totalHorizontalWidth - 0.5f * _totalHorizontalWidth, yFixedPosVal, 0);
            go.transform.localScale    = Vector3.one;
            LoopScrollViewWithSelectedEffect_Drag drag = go.GetComponent <LoopScrollViewWithSelectedEffect_Drag>();
            if (drag == null)
            {
                drag = go.AddComponent <LoopScrollViewWithSelectedEffect_Drag>();
            }
            drag.SetScrollView(this);
            LoopScrollViewWithSelectedEffect_Item item = go.GetComponent <LoopScrollViewWithSelectedEffect_Item>();
            if (item == null)
            {
                item = go.AddComponent <LoopScrollViewWithSelectedEffect_Item>();
            }
            item.oriListIndex = i;
            item.dataLength   = _dataLength;
            item.SetScollView(this);
            item.SetItemDefaultShowCallback(itemDefaultShowCallback);
            item.SetItemSelectCallback(itemSelectCallback);
            item.SetItemUnSelectCallback(itemUnSelectCallback);
            item.SetItemPassBeginCallback(itemPassBeginCallback);
            item.SetItemPassEndCallback(itemPassEndCallback);
            _oriItemList.Add(item);
        }
        itemTemplate.SetActive(false);
        #region 修正数据
        int index           = 0;
        int centerItemIndex = _startCenterDataIndex % useItemCount;
        int dataValOffset   = _startCenterDataIndex - centerItemIndex;
        // 必须倒序循环,因为要按“中心卡牌为0,左边为负,右边为正”的位置摆牌(正序循环则会相反)
        for (int i = useItemCount - 1; i >= 0; i--)
        {
            var item = _oriItemList[i];
            // 乘上factor就是为了让centerOffSet是个小数
            item.centerOffSet = _factor * (_oriListCenterIndex - index);
            item.SetSelectState(false);
            index++;
        }
        xValSortItemList      = new List <LoopScrollViewWithSelectedEffect_Item>(_oriItemList);
        _curCenterItem        = _oriItemList[centerItemIndex];
        _totalHorizontalWidth = useItemCount * itemSpacingWidth;
        // 为了让中心单位出现在视图中心,就得用0.5减(和后面GetXPosValue函数有关)
        // 为什么不直接用0.5f的原因:如果用0.5f会算出有些牌SiblingIndex重复问题,但在滑动牌组时,应是每一张牌各占一层。
        float targetVal = 0.5f + startCenterXOffset - _curCenterItem.centerOffSet;
        LerpTweenToTarget(0, targetVal, 0, false);
        SortItemListByXVal();
        int indexOffset = _curCenterItem.oriListIndex - _curCenterItem.sortXValListIndex;
        for (var i = 0; i < xValSortItemList.Count; i++)
        {
            var item      = xValSortItemList[i];
            int dataIndex = (i + indexOffset + dataValOffset) % _dataLength;
            if (dataIndex < 0)
            {
                dataIndex += _dataLength;
            }
            item.dataIndex = dataIndex;
            item.DefaultShow();
        }
        #endregion
        for (int i = 0; i < xValSortItemList.Count; i++)
        {
            var item = xValSortItemList[i];
            item.DefaultShow();
        }
    }