效果:

cocos2dx伸缩式列表效果cocos2dx伸缩式列表效果

代码:

ElasticListView.h

#pragma once

//std
#include <string>
#include <map>

//cocos
#include "cocos2d.h"
#include "cocostudio/CocoStudio.h"
#include "ui/CocosGUI.h"

//self
//#include "studioUi/StudioUiBase.h"


using namespace std;

USING_NS_CC;
using namespace cocos2d::ui;
using namespace cocostudio;
using namespace cocostudio::timeline;


//列表项
class ElasticItem
{
public:
    ElasticItem();
    virtual ~ElasticItem();
    //清理
    void Clear();
    //创建ElasticList
    static ElasticItem* Create(Node *pRoot, Widget::ccWidgetTouchCallback callback,int itemIndex);
    //SetIsHaveExtTxt
    static void SetIsHaveExtTxt(bool isHave){ IsHaveExtTxt = isHave; }

    //初始化
    virtual bool Init(Node *pRoot, Widget::ccWidgetTouchCallback callback,int itemIndex);
    

public:
    //设置列表值
    void SetValue(int value){ _ElasticItemValue = value; }
    ///获取列表值
    int GetValue(){ return _ElasticItemValue; }
    //设置列表名称
    void SetItemName(const char *pName);
    //设置列表名称颜色
    void SetItemNameColor(const Color3B& color);
    //设置列表扩展文本
    void SetExtTxt(const char *pName);
    //设置扩展文本颜色
    void SetSetExtTxtColor(const Color3B& color);
    //设置扩展文本是否可见
    void SetExtTextVisible(bool bset);
    //获取控件根节点
    Node *GetRootNode(){ return _pElasticItemBtn; }
    //设置位置
    void SetPos(Vec2 &pos){ _pElasticItemBtn->setPosition(pos); }
    //显示隐藏
    void Show(bool bShow){ _pElasticItemBtn->setVisible(bShow); }
    //选中处理
    void OnSelect();
    //取消选中处理
    void OnCancleSelect();
    //更新item文本位置
    void UpdateItemTxtPos();



protected:

    //
    static bool IsHaveExtTxt;                //是否有扩展Txt

    int _itemIndex;                            //列表项索引
    int _ElasticItemValue;                    //列表项值

    //ui
    Text* _pItemNameTxt;                    //ItemNameTxt
    Text* _pExtTxt;                            //扩展Txt
    ui::Button* _pElasticItemBtn;            //列表项按钮
};



typedef map<int, ElasticItem*> ElasticItemMap;    //列表子项

class ElasticListView;
//弹出式列表
class ElasticList
{
public:
    //弹出弹入类型
    enum ActionType
    {
        ActionNone=0,        //没有动作
        ActionOut,            //弹出
        ActionIn,            //弹入
    };

    //item list 状态
    enum ItemListState
    {
        ListStateOut = 0,        //弹出
        ListStateIn,            //弹入
    };

public:
    ElasticList();
    virtual ~ElasticList();
    //创建
    static ElasticList* Create(int listIndex, ElasticListView *pElasticListView);
    //初始化
    virtual bool Init(int listIndex, ElasticListView *pElasticListView);
public:
    //设置列表值
    void SetValue(int value){ _elasticListValue = value; }
    //获取列表值
    int GetValue(){ return _elasticListValue; }
    //设置listIndex
    void SetListIndex(int value){ _listIndex = value; }
    //获取listIndex
    int GetListIndex(){ return _listIndex; }
    //设置列表名称
    void SetListName(const char *pName);
    //获取控件根节点
    Node *GetRootNode(){ return _pListPanel; }
    //获取ListSize
    Size GetListSize(){ return _pListPanel->getContentSize(); }
    //获取List高度
    float GetListHeight(){ return _totalHeight; }
    //设置位置
    void SetPos(Vec2 &pos){ _pListPanel->setPosition(pos); }
    //更新ElasticItem
    void UpdateElasticItem();
    //更新ElasticItem txt pos
    void UpdateElasticItemTxtPos();
    //更新
    void Update(float dt);
    //item touch callback
    void OnItemTouch(Ref* pSender, Widget::TouchEventType touchuType);
    //listname touch callback
    void OnListNameTouch(Ref* pSender, Widget::TouchEventType touchuType);
    //改变list state
    void ChangeListState(ItemListState tarState);
    //是否正在伸缩list
    bool IsElasticing();
    //清理
    void Clear();


    //选中item
    void SelectItem(ElasticItem *pItem);
    //获取item
    ElasticItem *GetItem(int itemIndex);
    //添加item
    ElasticItem *AddItem(int itemIndex);
    //删除item
    void DelItem(int itemIndex);

protected:
    //弹出更新
    void ActionOutUpdate(float dt);
    //弹入更新
    void ActionInUpdate(float dt);

protected:

    //data
    static const int NameVerticalPanding = 10;    //listname上方间距
    static const int ItemVerticalPanding = 6;    //ElasticItem上方间距
    static float ScaleSteep;                    //缩放系数
    

    bool _needUpdateUi;                            //需要更新ui
    int _elasticListValue;                        //列表值
    int _listIndex;                                //list索引
    float _totalHeight;                            //总高度

    
    ElasticListView *_pElasticListView;            //ElasticListView指针

    //action
    ActionType _curActionType;                //当前动作类型
    ItemListState _curListState;            //当前list状态

    //ui
    Layout *_pListPanel;                    //列表容器
    ui::Button *_pListName;                    //列表名
    ElasticItemMap _itemList;                //子项列表
};



typedef map<int, ElasticList*> ElasticListMap;    //列表map

typedef std::function<void(int)> ElasticItemListener;

//弹出式列表视图,内含多个ElasticList
class ElasticListView
{
public:
    ElasticListView();
    virtual ~ElasticListView();
    //获取list克隆控件
    Widget *GetElasticListClone(){ return _pElasticListClone; }
    //获取item克隆控件
    Widget *GetElasticItemClone(){ return _pElasticItemClone; }

    //创建ElasticList
    void AddElasticList(ElasticList *pElasticList);
    //获取ElasticList
    ElasticList * GetElasticList(int index);


public:
    //初始化
    bool Init(Node *pRoot);
    //注册更新
    void RigisterUpdate();
    //更新
    void Update(float dt);
    //更新ElasticList
    void UpdateElasticList();
    //是否正在缩放list
    bool IsElasticingList(){ return _isElasticing; }
    //设置是否正在缩放list
    void SetIsElasticingList(bool bSet);
    //保存ScrollView百分比位置
    void SaveScrollViewPercent();
    //恢复ScrollView百分比位置
    void RecoveryScrollViewPercent();
    //开始伸缩前的准备
    void PrepareElastic();
    //是否可以伸缩
    bool CanElasticList();
    //设置选中项
    void SetCurSelectItem(ElasticItem *pItem);
    //设置选中项
    void SetCurSelectItem(int listIndex, int itemIndex);
    //获取选中项
    ElasticItem *GetCurSelectItem(){ return _pCurSelectItem; }
    //设置选中监听回调
    void SetItemListener(const ElasticItemListener &listener){ _pSelItemListener = listener; }
    //清理
    void Clear();


protected:

    ElasticListMap _elasticListMap;                //列表map
    static const int VerticalPanding = 10;        //ElasticList垂直间距
    float _totalHeight;                            //总高度
    bool _isElasticing;                            //正在缩放list
    float _scrollViewPercent;                    //ScrollView百分比位置

    ElasticItemListener _pSelItemListener;        //选中item事件
    ElasticItem *_pCurSelectItem;                //当前选中的item

    //ui
    Widget *_pElasticListClone;                    //elasticList clone
    Widget *_pElasticItemClone;                    //elasticItem clone
    ui::ScrollView *_pConScrollView;            //ScrollView容器
};
View Code

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-08-05
  • 2022-12-23
  • 2022-12-23
  • 2021-11-05
  • 2021-06-22
  • 2021-11-04
猜你喜欢
  • 2022-12-23
  • 2021-08-23
  • 2022-12-23
  • 2022-12-23
  • 2021-11-30
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案