Example #1
0
    /// <summary>
    /// ScrollView变量初期化
    /// </summary>
    public void Clear()
    {
        isActived = false;

        _scrollView.DisableSpring();
        _scrollView.restrictWithinPanel = false;
        if (_scrollOrientation == ScrollOrientation.VERTICAL)
        {
            _scrollView.MoveRelative(new Vector3(0, _scrollView.panel.clipOffset.y, 0));
        }
        if (_scrollOrientation == ScrollOrientation.HORIZONTAL)
        {
            _scrollView.MoveRelative(new Vector3(_scrollView.panel.clipOffset.x, 0, 0));
        }

        for (int i = _itemsList.Count - 1; i >= 0; i--)
        {
            (this as ObjectPool <GameObject>).Store(_itemsList[i].gameObject);
        }

        _itemsList            = null;
        _lastPosition         = 0;
        _itemsToRecycleBefore = 0;

        onListMoved = null;

        _scrollView.restrictWithinPanel = true;
    }
Example #2
0
    /// <summary>
    /// 初始化方法
    /// 步骤:
    /// 1.AddComponent<此组件>()
    /// 2.设置EnableMultiLine属性值
    ///   例如:多行多列
    ///     EnableMultiLine = true
    ///     _spacing_row = 行间距
    ///     _spacing_line = 列间距
    /// 3.预制继承自UIScrollViewItemBase的子类
    /// 4.调用Create(列表项总数,预制体)方法
    /// </summary>
    /// <param name="items">实例化项目个数</param>
    /// <param name="listItemPrefab">实例化的模板</param>
    public void Create(int items, UIScrollViewItemBase listItemPrefab)
    {
        _itemsTotal = items;
        p_prefab    = listItemPrefab.gameObject;

        switch (_scrollOrientation)
        {
        case ScrollOrientation.HORIZONTAL:
            if (!EnableMultiLine)
            {
                _itemSize     = listItemPrefab.Size.x;
                _itemsVisible = Mathf.CeilToInt(GetViewportSize() / (_itemSize + _spacing));
            }
            else
            {
                _itemSize_ml = new Vector2(listItemPrefab.Size.x, listItemPrefab.Size.y);

                _itemsVisible_row  = Mathf.CeilToInt(_viewport.width / (_itemSize_ml.x + _spacing_line));
                _itemsVisible_line = Mathf.FloorToInt(_viewport.height / (_itemSize_ml.y + _spacing_row));
            }
            break;

        case ScrollOrientation.VERTICAL:
            if (!EnableMultiLine)
            {
                _itemSize     = listItemPrefab.Size.y;
                _itemsVisible = Mathf.CeilToInt(GetViewportSize() / (_itemSize + _spacing));
            }
            else
            {
                _itemSize_ml = new Vector2(listItemPrefab.Size.x, listItemPrefab.Size.y);
                //垂直方向时,row可显示item数量使用向下舍位取整
                _itemsVisible_row  = Mathf.FloorToInt(_viewport.width / (_itemSize_ml.x + _spacing_line));
                _itemsVisible_line = Mathf.CeilToInt(_viewport.height / (_itemSize_ml.y + _spacing_row));

                //print("_itemsVisible_row = " + _itemsVisible_row);
                //print("_itemsVisible_line = " + _itemsVisible_line);
            }
            break;
        }//end Switch

        //Debug.LogWarning("GetViewportSize() "+ GetViewportSize()+"  "+ _itemSize
        //    +"  Mathf.CeilToInt()"+ Mathf.CeilToInt(GetViewportSize() / _itemSize)
        //    );

        int itemsToInstantiate = EnableMultiLine ? _itemsVisible_row * _itemsVisible_line : _itemsVisible;

        if (itemsToInstantiate > items || (items >= itemsToInstantiate && items <= 2 * itemsToInstantiate))
        {
            itemsToInstantiate = items;

            //CHANGED: 2017-7-06 添加自动补齐行/列开关
            if (WhetherAutomaticallyFill)
            {
                if (itemsToInstantiate % _itemsVisible_row != 0)//每行项目数不满的时候,补齐行
                {
                    itemsToInstantiate += Mathf.CeilToInt((float)itemsToInstantiate / (float)_itemsVisible_row) * _itemsVisible_row - itemsToInstantiate;
                }
            }
            //print("total:"+ items);
            //print("gen:"+ itemsToInstantiate);
            //print("itemsToInstantiate / _itemsVisible_row = " + (float)(itemsToInstantiate / _itemsVisible_row));
            //print("itemsToInstantiate = " + itemsToInstantiate);
            //print("_itemsVisible_row = " + _itemsVisible_row);
            //print("Mathf.CeilToInt(itemsToInstantiate / _itemsVisible_row) = " + Mathf.CeilToInt(itemsToInstantiate / _itemsVisible_row));
        }
        else
        {
            itemsToInstantiate *= 2;
        }

        _itemsList = new List <UIScrollViewItemBase>();

        for (int i = 0; i < itemsToInstantiate; i++)
        {
            UIScrollViewItemBase item = EnableMultiLine ?
                                        CreateNewItem(i, _itemSize_ml) : CreateNewItem(i, _itemSize);
            item.onSelected = HandleOnSelectedHandler;
            item.Index      = i;

            _itemsList.Add(item);
            ItemLoaded(item);//列表项加载完成Callback
        }

        _firstItemIndex = 0;
        _lastItemIndex  = _itemsList.Count - 1;

        _itemsToRecycleAfter = EnableMultiLine ?
                               _itemsList.Count / _itemsVisible_row - _itemsVisible_line :
                               _itemsList.Count - _itemsVisible;

        //Debug.LogWarning("_itemSize = " + _itemSize);
        //Debug.LogWarning("_itemsVisible = " + _itemsVisible);
        //Debug.LogWarning("_itemsVisibles = " + _itemsVisible_row + " " + _itemsVisible_line);
        //Debug.LogWarning("itemsToInstantiate = " + itemsToInstantiate);
        //Debug.LogWarning("_itemsTotal = " + _itemsTotal);
        //Debug.LogWarning("_lastItemIndex = " + _lastItemIndex);

        //注册事件
        onListMoved += Recycle;//在列表向某方向移动了一整行后触发

        //List<EventDelegate> events_OnChange = new List<EventDelegate>();
        //events_OnChange.Add(new EventDelegate(HandleOnScrollBarValueChangedHandler));
        //_scrollBar.onChange = events_OnChange;
        isActived = true;
    }//end Create()