private void ScaleItem(UIScrollPickerItemCtrlBase item)
    {
        //当处于(0~半个宽度/高度)的范围内时,会被放大
        float dist   = 0;
        float itemWH = 0;

        if (direction == EmDirection.Horizontal)
        {
            dist   = item.transform.localPosition.x;
            itemWH = itemWidth * SCALE_POS_FACTOR;
        }
        else
        {
            dist   = item.transform.localPosition.y;
            itemWH = itemHeight * SCALE_POS_FACTOR;
        }
        //
        float scale = 1;

        if (dist < 0)
        {
            dist = -dist;
        }
        if (dist < itemWH)
        {
            scale = Mathf.Lerp(pickedItemScale, 1, dist / itemWH);
        }
        item.transform.localScale = new Vector3(scale, scale, scale);
    }
    public void Reposition()
    {
        int itemCount = itemArray.Length;

        Vector3 startPos = Vector3.zero;

        if (direction == EmDirection.Horizontal)
        {
            startPos.x = -(itemWidth + itemGap) * (curSelectIndex);            //左边有几个,起点就得偏移多少
        }
        else
        {
            startPos.y = (itemHeight + itemGap) * (curSelectIndex);            //左边有几个,起点就得偏移多少
        }
        for (int i = 0; i < itemCount; i++)
        {
            UIScrollPickerItemCtrlBase item = itemArray[i];
            Vector3 p = Vector3.zero;

            if (direction == EmDirection.Horizontal)
            {
                p.x = i * (itemWidth + itemGap);
            }
            else
            {
                p.y = -i * (itemHeight + itemGap);
            }

            item.transform.localPosition = startPos + p;

            ScaleItem(item);
        }
    }
    void Update_Spring()
    {
        if (isDragging)
        {
            return;
        }
        if (!isSpring)
        {
            return;
        }

        if (Time.deltaTime > 0.05f)
        {
            springTimer += 0.05f;
        }
        else
        {
            springTimer += Time.deltaTime;
        }

        float   f   = springTimer / springDuration;
        Vector3 pos = Vector3.Lerp(springStartPos, Vector3.zero, f);

        itemArray[curSelectIndex].transform.localPosition = pos;
        //其他的项,从selected item向两边对齐
        for (int i = 0; i < itemArray.Length; i++)
        {
            UIScrollPickerItemCtrlBase item = itemArray[i];
            Vector3 v = pos;
            if (direction == EmDirection.Horizontal)
            {
                v.x += (itemWidth + itemGap) * (i - curSelectIndex);
            }
            else
            {
                v.y -= (itemHeight + itemGap) * (i - curSelectIndex);
            }

            item.transform.localPosition = v;

            ScaleItem(item);
        }

        if (springTimer >= springDuration)
        {
            isSpring = false;
        }
    }
    private void Move(Vector3 delta)
    {
        if (direction == EmDirection.Horizontal)
        {
            delta.y = 0;
        }
        else
        {
            delta.x = 0;
        }

        //begin 如果第一个或者最后一个会拉过头,则不拉
        //第一个
        Vector3 pos    = itemArray[0].transform.localPosition;
        Vector3 newPos = pos + delta;

        if (newPos.x > 0)
        {
            delta.x = -pos.x;
        }
        if (newPos.y < 0)
        {
            delta.y = -pos.y;
        }
        //最后那个
        pos    = itemArray[itemArray.Length - 1].transform.localPosition;
        newPos = pos + delta;
        if (newPos.x < 0)
        {
            delta.x = -pos.x;
        }
        if (newPos.y > 0)
        {
            delta.y = -pos.y;
        }
        //end

        for (int i = 0; i < itemArray.Length; i++)
        {
            UIScrollPickerItemCtrlBase item = itemArray[i];
            item.transform.localPosition += new Vector3(delta.x, delta.y, 0);

            ScaleItem(item);

            //如果item到原点的距离小于一定值,认为被选中了
            float threshold = 0;
            float dist      = 0;
            if (direction == EmDirection.Horizontal)
            {
                threshold = itemWidth * SCALE_POS_FACTOR;
                dist      = item.transform.localPosition.x;
            }
            else
            {
                threshold = itemHeight * SCALE_POS_FACTOR;
                dist      = item.transform.localPosition.y;
            }
            //
            int s = curSelectIndex;
            if (Mathf.Abs(dist) < threshold)
            {
                s = i;
            }

            if (s != curSelectIndex)
            {
                curSelectIndex = s;
                if (selectChangeCallback != null)
                {
                    selectChangeCallback(item, curSelectIndex);
                }
                Debug.Log("seleced item changed: Cur = " + curSelectIndex);
            }
        }
    }