想实现一个弧形的列表,滑动时,item的y轴值和roration同时改变

目前实现的方式是做一个圆盘,将item放在圆盘上,用原生的touchmove来实现,但体验效果不好,而且也没有list的惯性效果,这里有一个已经实现的效果,想问一下大家,这种效果应该如何实现。

企业微信截图_15979120694871.png

 
已邀请:

a1436921873 - 90后

赞同来自:

_list.scrollPane.onScroll.Add(DoSpecialEffect); 在例子的looplist里面可以参考下

EvilShuU

赞同来自:

private Vector2 circleCenter = new Vector2(0, 0);
 
list.scrollPane.onScroll.Add(DoCircle);
 
private void DoCircle() {
        //动态算出当前滑动圆心
        float listCenterX = list.scrollPane.posX + list.viewWidth / 2;
        circleCenter.x = listCenterX;

        for (int i = 0; i < list.numChildren; i++) {
            GObject item = list.GetChildAt(i);

            Vector2 posItem = new Vector2(item.x + item.width / 2, item.y);
            Vector2 dir = circleCenter - posItem;

            float angle = Vector2.Angle(Vector2.up, dir);
            float cosY = Mathf.Cos(angle / 180 * Mathf.PI);
            float posTarY = cosY * radius;

            //Debug.Log(list.ChildIndexToItemIndex(i) + " : angle: " + angle + ";  cosY : " + cosY);

            float offsetY = radius - cosY * radius;
            //Debug.Log(list.ChildIndexToItemIndex(i) + " : offsetY: " + offsetY);
            item.y = offsetY;
        }
    }

    private void DoEnd() {

        int indexItem = 0;
        float minDistance = 0;

        //动态算出当前滑动圆心
        float listCenterX = list.scrollPane.posX + list.viewWidth / 2;

        for (int i = 0; i < list.numChildren; i++) {
            GObject item = list.GetChildAt(i);
            float itemCenter = item.x + item.width / 2;
            float itemWidth = item.width;
            float distance = Mathf.Abs(listCenterX - itemCenter);
            if (i == 0) {
                minDistance = distance;
                indexItem = list.ChildIndexToItemIndex(i);
            }
            else {
                if (distance < minDistance) {
                    minDistance = distance;
                    indexItem = list.ChildIndexToItemIndex(i);
                }
            }
        }

        //转换到显示对象索引
        ScrollToView(indexItem, true);
    }

    private void OnClickItem(EventContext context) {
        GButton item = ((GObject)context.data).asButton;
        if (item == null)
            return;

        if (item.grayed) {
            list.selectedIndex = -1;
            return;
        }

        int indexChild = list.GetChildIndex(item);
        int indexItem = list.ChildIndexToItemIndex(indexChild);
        Debug.Log("indexItem: " + indexItem);
        ScrollToView(indexItem, true);
    }

    private void ScrollToView(int index, bool ani = false) {
        int targetIndex = index - 1;
        if (targetIndex < 0) {
            list.ScrollToView(0, ani);
        }
        else {
            list.ScrollToView(targetIndex, ani);
        }
    }

要回复问题请先登录注册