コード例 #1
0
    public void OnEndDrag()
    {
        int closetIndex = 0;
        // 只要小数部分,因为整数部分因为位置x的曲线设置,其实不影响
        float value = _curHorizontalValue - (int)_curHorizontalValue;
        float min   = float.MaxValue;
        float tmp   = 0.5f * (_curHorizontalValue < 0 ? -1 : 1);

        // 在滑动中,每个单位都在移动,看哪个单位是距离中心位最近的
        for (int i = 0; i < _oriItemList.Count; i++)
        {
            // (tmp - _oriItemList[i].centerOffSet)其实是为了把centerOffSet放大到0-1范围,为什么要放大到0-1范围?因为value在0-1范围。
            float dis = Mathf.Abs(Mathf.Abs(value) - Mathf.Abs(tmp - _oriItemList[i].centerOffSet));
            if (dis < min)
            {
                closetIndex = i;
                min         = dis;
            }
        }
        _originHorizontalValue = _curHorizontalValue;
        float target = (int)_curHorizontalValue + (tmp - _oriItemList[closetIndex].centerOffSet);

        _preCenterItem = _curCenterItem;
        _curCenterItem = _oriItemList[closetIndex];
        LerpTweenToTarget(_originHorizontalValue, target, target > _originHorizontalValue ? 1 : -1, true);
        _canChangeCenterItem = false;
    }
コード例 #2
0
    /// <summary>
    /// 获取指定单位之间的距离,因为是循环滑动,滑到索引5接下来就到索引0,为了让此时两者距离是1而不是5而设计的这个函数
    /// </summary>
    /// <param name="preCenterItem"></param>
    /// <param name="newCenterItem"></param>
    /// <returns></returns>
    private int GetMoveCurveFactorCount(LoopScrollViewWithSelectedEffect_Item preCenterItem, LoopScrollViewWithSelectedEffect_Item newCenterItem)
    {
        SortItemListByXVal();
        int factorCount = newCenterItem.sortXValListIndex - preCenterItem.sortXValListIndex;

        return(Mathf.Abs(factorCount));
    }
コード例 #3
0
 /// <summary>
 /// 滑动更新
 /// </summary>
 /// <param name="targetValue"></param>
 /// <param name="moveDir">牌右移:1,左移:-1,不移:0</param>
 public void UpdateScrollView(float targetValue, int moveDir)
 {
     for (int i = 0; i < _oriItemList.Count; i++)
     {
         LoopScrollViewWithSelectedEffect_Item item = _oriItemList[i];
         float xValue     = GetXPosValue(targetValue, item.centerOffSet);
         float scaleValue = GetScaleValue(targetValue, item.centerOffSet);
         float depthValue = GetDepthValue(targetValue, item.centerOffSet);
         item.UpdateScrollViewItems(xValue, moveDir, depthValue, _oriItemList.Count, yFixedPosVal, scaleValue);
     }
 }
コード例 #4
0
    /// <summary>
    /// 点击选中的单位滑到中间
    /// </summary>
    /// <param name="selectItem"></param>
    public void SetCenterItem(LoopScrollViewWithSelectedEffect_Item selectItem)
    {
        if (!_canChangeCenterItem)
        {
            return;
        }
        if (_curCenterItem == selectItem)
        {
            return;
        }
        _canChangeCenterItem = false;
        _preCenterItem       = _curCenterItem;
        _curCenterItem       = selectItem;
        float centerXValue = positionCurve.Evaluate(0.5f) * _totalHorizontalWidth - _totalHorizontalWidth * 0.5f;
        // 选中牌是否在右边
        bool  isRight        = selectItem.transform.localPosition.x > centerXValue;
        int   moveIndexCount = GetMoveCurveFactorCount(_preCenterItem, selectItem);
        float value          = isRight ? -_factor : _factor;

        value *= moveIndexCount;
        float targetVal = _curHorizontalValue + value;

        LerpTweenToTarget(_curHorizontalValue, targetVal, targetVal > _curHorizontalValue ? 1 : -1, true);
    }
コード例 #5
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();
        }
    }