Cocos2d-x 3.2键盘操控列表页的初步实现

2015年03月23日 11:45 0 点赞 0 评论 更新于 2025-11-21 18:15

一 、思路\n

\n\t由于要加载较多数据,那么为了使得界面更近流畅,我采用TableView,其中他的Cell是可以复用的。创建10000个也是秒秒钟的事情。\n

\n

\n\t那么使用上下排列的TableView,每个cell自定义三个Item即可,当然也可以N个,可以自己写好接口。\n

\n

\n\t由于我们想使得tableView可以滚动到指定的cell位置,也就是一格一格滚动,那么我们最好自定义一个tableView继承于系统的tableView.\n

\n

\n\t二 、实现步骤\n

\n

\n\t如果你对于TableView不太熟悉,建议先看官方Testcpp例子。\n

\n

\n\t如果你比较熟悉,那么我就不废话,继续往下讲了。\n

\n

\n\t我们先来自定义一个TableViewcell。也就是自定义一行的内容。我相信这个非常简单。\n

\n

\n\t三、准备工作\n

\n

\n\t我们先来自定义一个TableViewcell。也就是自定义一行的内容。我相信这个非常简单。\n

\n

\n\tcell头文件\n

\n

\n\tclass XTableViewCell : public cocos2d::extension::TableViewCell
\n{
\n    public:
\n    XTableViewCell();
\n    virtual ~XTableViewCell();
\n    CREATE_FUNC(XTableViewCell);
\n    /************************/
\n    /                  update item by data                                 /
\n    /************************/
\n    bool updateItemData(const unsigned int tag,
\n                        const std::string icon,
\n                        const std::string name,
\n                        const std::string size,
\n                        const std::string downnum,
\n                        const std::string score);
\n    bool setItemSelected(const unsigned int tag,bool isSeleted);
\n    CC_CONSTRUCTOR_ACCESS:
\n    bool init();
\n    //bool init
\n    bool initLayout();
\n    void update(float t);
\n    private:
\n    cocos2d::Size _cellSize;  //the size of cell
\n    unsigned char _itemNum;   // the number of item
\n};\n

\n

\n\tcell源文件\n

\n

\n\t/////////////////////////////////////////////////////////////////////////////////////////////
\n 
\n/********CustomTableViewCell Class***********/
\n 
\n////////////////////////////////////////////////////////////////////////////////////////////
\n 
\n 
\nXTableViewCell::XTableViewCell():_itemNum(3),_cellSize(Size(1920,275))
\n{
\n 
\n}
\n 
\nXTableViewCell::~XTableViewCell()
\n{
\n 
\n}
\n 
\nbool XTableViewCell::init()
\n{
\n    IF_NULL_RETURN_FALSE(Node::init());
\n    IF_NULL_RETURN_FALSE(initLayout());
\n    //scheduleUpdate();
\n    //resumeSchedulerAndActions();
\n    return true;
\n}
\n 
\nbool XTableViewCell::initLayout()
\n{
\n    auto lout = ui::Layout::create();
\n    IF_NULL_RETURN_FALSE(lout);
\n    lout->setLayoutType(ui::Layout::Type::ABSOLUTE);
\n    lout->setTouchEnabled(true);
\n    lout->setLoopFocus(false);
\n    lout->setPassFocusToChild(true);
\n    lout->setContentSize(Size(_cellSize.width,200.0f));
\n    this->addChild(lout);
\n    lout->setTag(100);
\n    lout->setAnchorPoint(Vec2::ANCHOR_BOTTOM_LEFT);
\n    lout->setPosition(Vec2(0,75));
\n    for(int j =0;j<_itemNum;j++)
\n    {      
\n        const std::string txt = StringUtils::format("%dt%d",0,j);//名称后面得重新修改
\n        GridItem item = GridItem::create();
\n        IF_NULL_RETURN_FALSE(item);
\n        item->setPosition(Vec2(j
600+90,0));
\n        item->setName(txt);
\n        lout->addChild(item,1,j);
\n    }
\n    return true;
\n}
\n 
\nvoid XTableViewCell::update( float t )
\n{
\n    log(“XTableViewCell::update”);
\n}
\n 
\nbool XTableViewCell::updateItemData( const unsigned int tag,
\n                                     const std::string icon,
\n                                     const std::string name,
\n                                     const std::string size,
\n                                     const std::string downnum,
\n                                     const std::string score )
\n{
\n    auto lout = this->getChildByTag(100);
\n    IF_NULL_RETURN_FALSE(lout);
\n    auto item  = (GridItem)lout->getChildByTag(tag);
\n    IF_NULL_RETURN_FALSE(item);
\n    if(“”!=icon)
\n    {
\n        item->updateIcon(icon);
\n    }
\n    if(“”!=name)
\n    {
\n        item->updateName(name);
\n    }
\n    if(“”!=size)
\n    {
\n        item->updateSize(size);
\n    }
\n    if(“”!=downnum)
\n    {
\n        item->updateDownNum(downnum);
\n    }
\n    if(“”!=score)
\n    {
\n        item->updateScore(score);
\n    }
\n    return true;
\n}
\n 
\nbool XTableViewCell::setItemSelected( const unsigned int tag,bool isSeleted )
\n{
\n    auto lout = this->getChildByTag(100);
\n    IF_NULL_RETURN_FALSE(lout);
\n    auto item  = (GridItem
)lout->getChildByTag(tag);
\n    IF_NULL_RETURN_FALSE(item);
\n    item->setSelected(isSeleted);
\n    return true;
\n}\n

\n

\n\t里面都实现了什么,其实就是简单的添加了三个自定义Item。\n

\n

\n\t然后,我们自定义一个TableView实现了两个方法:\n

\n

\n\t一个是去实现滚动到指定cell的方法。\n

\n

\n\t另外一个是我使用触摸的时候需要获得当前使用的cell去判断哪个Item位置位于触摸位置。\n

\n

\n\t我们这里只讲键盘的。那么你可能就用不到这个函数了。\n

\n

\n\t代码如下:\n

\n

\n\tclass XTableView : public cocos2d::extension::TableView  
\n{  
\npublic:  
\n    /
 
\n     @brief scroll to the Designated cell 
\n    
 @param index — the idx of Designated cell 
\n    **/  
\n    void scrollToCellIndex(ssize_t index);  
\n    /*
**************** 
\n     @decripition  if you need Analyzing touch item , 
\n    
  maby you will use this function to get used cell    
\n    ******************/  
\n    cocos2d::Vector<cocos2d::extension::tableviewcell> getCurrentCells() const;  
\n}; 
\n 
\n/////////////////////////////////////////////////////////////////////////////////////////////  
\n   
\n/
********XTableView Class************/  
\n   
\n////////////////////////////////////////////////////////////////////////////////////////////  
\nvoid XTableView::scrollToCellIndex( ssize_t index )  
\n{  
\n    this->getContainer()->stopAllActions();  
\n    Vec2 offset = _offsetFromIndex(index)-1;  
\n    Vec2 maxOffSet = this->maxContainerOffset();  
\n    Vec2 minOffSet = this->minContainerOffset();  
\n    float offX = MIN(offset.x,maxOffSet.x);  
\n    offX = MAX(offX,minOffSet.x);  
\n    float offY = MIN(offset.y,maxOffSet.y);  
\n    offY = MAX(offY,minOffSet.y);  
\n    this->setContentOffset(Vec2(offX,offY),true);  
\n}  
\n   
\ncocos2d::Vector<cocos2d::extension::tableviewcell
> XTableView::getCurrentCells() const  
\n{  
\n    log(“used cell count is %d”,_cellsUsed.size());  
\n    return this->_cellsUsed;  
\n}</cocos2d::extension::tableviewcell></cocos2d::extension::tableviewcell>\n

\n

\n\t好了,那么接下来的重点是列表页的实现。\n

\n

\n\t四、页面具体实现\n

\n

\n\t由于篇幅受限,代码内容比较多,相信大家自己分析就能理解,那么先就不废话了,先上代码吧。不懂的或者有好的建议可以与本文笔者联系讨论。\n

\n

\n\t头文件(注:具体数据录入,我自己的已删除,需要的可以添加自己的数据,现在展示的基本只是一个界面)\n

\n

\n\tenum  class POS_TYPE
\n{
\n    TYPE_0,//     right,   down and scroll up
\n    TYPE_1,//left,right,   down and scroll up
\n    TYPE_2,//left,         down and scroll up
\n    TYPE_3,//     right,up,down
\n    TYPE_4,//left,right,up,down
\n    TYPE_5,//left,      up,down
\n    TYPE_6,//     right,up,     and           scroll down
\n    TYPE_7,//left,right,up,     and           scroll down
\n    TYPE_8,//left,      up,     and           scroll down
\n    TYPE_9 // can do nothing
\n};
\nenum  class CHANGE_TYPE
\n{
\n    LEFT,
\n    RIGHT,
\n    UP,
\n    DOWN,
\n    UP_SCROLL,
\n    DOWN_SCROLL,
\n    NOTHING
\n};
\ntypedef struct 
\n{
\n    //item idx ,and start from value 0 to _pageX
\n    unsigned char idx;
\n    //cell idx
\n    unsigned int cellIdx;
\n    // selected state
\n    bool isSelected;
\n    /
************
\n    
    pos in screen like a matrix,such as                                     
\n                   (0,0),(1,0),(2,0)
\n            
       (0,1),(1,1),(2,1)
\n                   (0,2),(1,2),(2,2)
\n    
************/
\n    unsigned char posX;
\n    unsigned char posY;
\n 
\n    POS_TYPE posType;
\n 
\n}itemState;
\nclass XGridView :public cocos2d::Layer, public cocos2d::extension::TableViewDataSource, public cocos2d::extension::TableViewDelegate
\n{
\n    public:
\n 
\n        CREATE_FUNC(XGridView);
\n        /

\n        
@brief create a GridView
\n        @
\n        
**/
\n        virtual void scrollViewDidScroll(cocos2d::extension::ScrollView view);
\n        virtual void scrollViewDidZoom(cocos2d::extension::ScrollView
 view);
\n        virtual void tableCellTouched(cocos2d::extension::TableView table, cocos2d::extension::TableViewCell cell);
\n        virtual cocos2d::Size tableCellSizeForIndex(cocos2d::extension::TableView table, ssize_t idx);
\n        virtual cocos2d::extension::TableViewCell
 tableCellAtIndex(cocos2d::extension::TableView table, ssize_t idx);
\n        virtual ssize_t numberOfCellsInTableView(cocos2d::extension::TableView 
table);
\n 
\nCC_CONSTRUCTOR_ACCESS:
\n        XGridView();
\n        virtual ~XGridView();
\n        virtual bool init();
\n 
\n        virtual bool initWithDatas(ssize_t cellTotalNum,const cocos2d::Size tableSize);
\n        virtual bool initMoveFoucus();
\n        virtual bool initTable();
\n        virtual bool initProgressBar();
\n        virtual bool initKeyListen();
\n        virtual void initStateMatrix();
\n        virtual void keyHandler(cocos2d::EventKeyboard::KeyCode key);
\n 
\n        virtual bool onTouchBegan(cocos2d::Touch touch, cocos2d::Event unused_event); 
\n        virtual void onTouchMoved(cocos2d::Touch touch, cocos2d::Event unused_event); 
\n        virtual void onTouchEnded(cocos2d::Touch touch, cocos2d::Event unused_event); 
\n        virtual void onTouchCancelled(cocos2d::Touch touch, cocos2d::Event unused_event);
\n        virtual void listenItemTouch(cocos2d::Touch touch, cocos2d::Event unused_event);
\n        void updateBySceenState();
\n        virtual void isItemTouched(cocos2d::Node item,const cocos2d::Vec2 point);
\n        virtual void deCodeByJson();
\n 
\n        void update(float t);
\n        virtual void onEnterTransitionDidFinish();
\n         
\n        //some model function
\n         
\n        bool isSelectedByIdx(ssize_t mIdx) const;
\n        void updateSceenStateByKey(cocos2d::EventKeyboard::KeyCode key);
\n        POS_TYPE getPosTypeByXY(unsigned int X_i,unsigned int Y_j);
\n        itemState
 getSelectedItemState() const;
\n        CHANGE_TYPE getChangeType(POS_TYPE posType,cocos2d::EventKeyboard::KeyCode key);
\n        void updateMoveFoucs(cocos2d::EventKeyboard::KeyCode key,POS_TYPE pos);
\n        void loadPageNumData(unsigned int cellIndx);
\n        void keyListenDelay(float t);
\n        void updateDalay(float t);
\n        void onExit() override;
\n        // update cell at idx
\n        void updateCellAtIdx(ssize_t idx);
\n        // update Item At idx
\n        void updateItemAtIdx(ssize_t idx);
\n         
\n    private:
\n        XTableView _mTable;
\n        cocos2d::Sprite
 _progressBar;
\n        ssize_t _cellTotalNum;
\n        cocos2d::Size _tableSize;
\n        ssize_t _pageX;
\n        ssize_t _pageY;
\n        std::vector _iconImg;
\n        std::vector _appName;
\n        std::vector _appSize;
\n        std::vector _downNum;
\n        std::vector _appScore;
\n 
\n        //the state of screen,true means selected and false means unselected
\n 
\n        std::vector _screenState;
\n 
\n        //the cell of selected idx
\n        ssize_t _currentCellIdx;
\n        //item idx which in cell
\n        unsigned char _selectedItmIdx;
\n        bool _isdecoded;
\n        unsigned int _itemTotalNum;
\n        std::atomic_bool _firstPageUpdate[9];
\n        cocos2d::Vec2 _pos[9];
\n        cocos2d::Sprite _moveFoucus;
\n 
\n        bool _keyContrl;
\n        long _scrollTime;
\n        bool _updateCell;
\n};\n

\n

\n\t源文件\n

\n

\n\tUSING_NS_CC;
\nUSING_NS_CC_EXT;
\n 
\nchar
 dataIndex[]=
\n{
\n    “allnum”,
\n    “appico”,   //APP ICO Image
\n    “apptitle”, //APP Name
\n    “downnum”,  //APP Down times
\n    “score” ,    //APP Score
\n    “appSize”    //APP size
\n};
\n 
\nXGridView::XGridView():_mTable(nullptr),_progressBar(nullptr),
\n    _cellTotalNum(100),_tableSize(Size(1920.0f,960.0f)),_moveFoucus(nullptr),
\n    _pageX(3),_pageY(3),_gridId(0),_isdecoded(false),_keyContrl(true),_currentCellIdx(0),
\n    _selectedItmIdx(0),_itemTotalNum(300),_loadNum(0),_scrollTime(0L),_updateCell(true)
\n{
\n     
\n}
\n 
\n 
\n 
\nXGridView::~XGridView()
\n{
\n    CC_SAFE_RELEASE(_mTable);
\n    CC_SAFE_RELEASE(_progressBar);
\n 
\n}
\n 
\n 
\nbool XGridView::init()
\n{
\n    IF_RETURN_FALSE(!initWithDatas(_cellTotalNum,_tableSize));
\n    return true;
\n}
\n 
\nbool XGridView::initWithDatas(ssize_t cellTotalNum,const Size tableSize )
\n{
\n    IF_NULL_RETURN_FALSE(Layer::init());
\n    setData(_json);
\n    _cellTotalNum = cellTotalNum;
\n    _tableSize = tableSize;
\n    IF_NULL_RETURN_FALSE(initKeyListen());
\n    IF_NULL_RETURN_FALSE(initMoveFoucus());
\n    IF_NULL_RETURN_FALSE(initTable());
\n    IF_NULL_RETURN_FALSE(initProgressBar());
\n    initStateMatrix();
\n    deCodeJsonById();
\n    return true;
\n}
\n 
\n 
\n 
\nvoid XGridView::tableCellTouched(TableView table,TableViewCell cell )
\n{
\n     log(“cell touched at index: %ld”, cell->getIdx());
\n     auto lout = (ui::Layout)cell->getChildByTag(100);
\n     IF_RETURN(!lout);
\n     for(auto &item : lout->getChildren())
\n     {
\n         if(!item)
\n             continue;
\n         else
\n         {
\n             if(item==lout->getCurrentFocusedWidget(true))
\n             {
\n                 ((GridItem
)item)->setSelected(true);
\n                 //_selectedIdx = cell->getIdx()_pageX+item->getTag();
\n             }
\n             else
\n             {
\n                 ((GridItem
)item)->setSelected(false);
\n             }
\n         }
\n     }
\n}
\n 
\nSize XGridView::tableCellSizeForIndex(TableView table, ssize_t idx )
\n{
\n 
\n    return Size(_tableSize.width, _tableSize.height/_pageY);
\n}
\n 
\nTableViewCell
 XGridView::tableCellAtIndex(TableView table, ssize_t idx )
\n{
\n    auto string = String::createWithFormat(“%ld”, idx);
\n 
\n    TableViewCell 
cell = table->dequeueCell();
\n    if (!cell) {
\n        cell = XTableViewCell::create();
\n 
\n        IF_RETURN_P(!cell,nullptr);
\n        cell->autorelease();
\n        return cell;
\n        for(unsigned char i=0;i<_pageX;i++)
\n        {  
\n            IF_NULL_CONTINUE(_isdecoded);
\n            ssize_t itemIdx = idx_pageX+i;
\n            IF_CONTINUE(itemIdx>_iconImg.size()-1||itemIdx>_appName.size()-1);
\n            ((XTableViewCell
)cell)->updateItemData(i,_iconImg.at(itemIdx),_appName.at(itemIdx),”5.03M”,””,”7.6″);
\n            ((XTableViewCell)cell)->setItemSelected(i,idx==_currentCellIdx&&i==_selectedItmIdx);
\n        }
\n 
\n        auto label = Label::createWithSystemFont(string->getCString(), “Helvetica”, 40.0);
\n        IF_NULL_RETURN_P(label,cell);
\n        label->setPosition(Vec2::ZERO);
\n        label->setAnchorPoint(Vec2::ZERO);
\n        label->setTag(123);
\n        cell->addChild(label);
\n    }
\n    else
\n    {
\n 
\n        auto _cellChild = cell->getChildByTag(100);
\n        for(unsigned char i=0;i<_pageX;i++)
\n        {  
\n            IF_NULL_CONTINUE(_isdecoded);
\n            ssize_t itemIdx = idx
_pageX+i;
\n            IF_CONTINUE(itemIdx>_iconImg.size()-1||itemIdx>_appName.size()-1);
\n            ((XTableViewCell)cell)->updateItemData(i,_iconImg.at(itemIdx),_appName.at(itemIdx),”5.03M”,””,”7.6″);
\n            ((XTableViewCell
)cell)->setItemSelected(i,idx==_currentCellIdx&&i==_selectedItmIdx);
\n        }
\n        auto label = (Label)cell->getChildByTag(123);
\n        IF_RETURN_P(!label,cell);
\n        label->setString(string->getCString());
\n    }
\n     
\n 
\n    return cell;
\n}
\n 
\nssize_t XGridView::numberOfCellsInTableView(TableView 
table )
\n{
\n     return _cellTotalNum;
\n}
\nbool XGridView::initTable()
\n{
\n    _mTable = (XTableView)TableView::create(this,_tableSize);
\n    IF_RETURN_FALSE(!_mTable);
\n    _mTable->setDirection(ScrollView::Direction::VERTICAL);
\n    _mTable->setDelegate(this);
\n    this->addChild(_mTable);
\n    _mTable->setVerticalFillOrder(TableView::VerticalFillOrder::TOP_DOWN);
\n    _mTable->reloadData();
\n 
\n    return true;
\n}
\n 
\nvoid XGridView::scrollViewDidScroll( cocos2d::extension::ScrollView
 view )
\n{
\n    Vec2 pos = view->getContentOffset();
\n    Vec2 _pos = view->getContentSize()-view->getViewSize();
\n    float percent = -(pos.y/_pos.y);
\n     
\n    // log(“scroll percent is : %f”, percent);
\n     
\n     IF_NULL_RETURN(_progressBar);
\n     _progressBar->setPositionY(960/2-600/2
\n         +_progressBar->getScaleY()_progressBar->getContentSize().height
\n         +600
percent(1-_progressBar->getScaleY()));
\n}
\n 
\nvoid XGridView::scrollViewDidZoom( cocos2d::extension::ScrollView
 view )
\n{
\n 
\n}
\nbool XGridView::onTouchBegan( Touch touch, Event unused_event )
\n{
\n    return true;
\n}
\n 
\nvoid XGridView::onTouchMoved( Touch touch, Event unused_event )
\n{
\n 
\n}
\n 
\nvoid XGridView::onTouchEnded( Touch touch, Event unused_event )
\n{
\n    listenItemTouch(touch,unused_event);
\n}
\n 
\nvoid XGridView::onTouchCancelled( Touch touch, Event unused_event )
\n{
\n 
\n}
\n 
\nvoid XGridView::listenItemTouch( Touch touch, Event unused_event )
\n{  
\n 
\n    auto touchPoint = touch->getLocationInView();
\n    touchPoint = Director::getInstance()->convertToGL(touchPoint); 
\n     
\n    for(auto &e:_mTable->getCurrentCells())
\n    {
\n        IF_NULL_CONTINUE(e);
\n        log(“cell[%d]”,e->getIdx());
\n        auto lout = e->getChildByTag(100);
\n        IF_NULL_CONTINUE(lout);
\n        if(dynamic_cast<ui::layout>(lout))
\n        {
\n            for (auto item:((ui::Layout
)lout)->getChildren())
\n            {
\n                isItemTouched(item,touchPoint);
\n            }
\n        }
\n    }
\n}
\nvoid XGridView::isItemTouched( cocos2d::Node item,const cocos2d::Vec2 point )
\n{
\n    IF_RETURN(!item);
\n    auto gItem = dynamic_cast<griditem
>(item);
\n    IF_RETURN(!gItem);
\n    auto acP = gItem->getAnchorPoint();//item锚点
\n    auto itemPos = gItem->getPosition();//item相对父容器的pos
\n    itemPos = gItem->getParent()->convertToWorldSpaceAR(itemPos);//相对于世界的位置
\n    auto itemSize = gItem->getContentSize();
\n    auto itemRect  =  Rect(itemPos.x,itemPos.y,itemSize.width,itemSize.height);
\n    if(itemRect.containsPoint(point))
\n    {
\n        gItem->setSelected(true);
\n        //_selectedIdx = gItem->getIdx();
\n        //log(“_selectedIdx=%d”,_selectedIdx);
\n    }
\n    else
\n    {
\n        gItem->setSelected(false);
\n    }
\n}
\n 
\n 
\n 
\n 
\nbool XGridView::initProgressBar()
\n{
\n    auto barBg = Sprite::create(“grid/progress_bg.png”);
\n    IF_NULL_RETURN_FALSE(barBg);
\n    barBg->setAnchorPoint(Vec2::ANCHOR_BOTTOM_LEFT);
\n    barBg->setPosition(90+600+600+500+80,960/2-600/2);
\n    addChild(barBg);
\n    _progressBar = Sprite::create(“grid/progress_pre.png”);
\n    IF_NULL_RETURN_FALSE(_progressBar);
\n    _progressBar->setAnchorPoint(Vec2::ANCHOR_TOP_LEFT);
\n 
\n    addChild(_progressBar);
\n    float scaleY = 1;
\n    if(_cellTotalNum>_pageY)
\n    {
\n        //float s = _pageY/_cellTotalNum;
\n        scaleY = MAX(_pageY/(_cellTotalNum1.0f),0.02f);
\n    }
\n         
\n    _progressBar->setScaleY(scaleY);
\n    _progressBar->setPosition(90+600+600+500+80,960/2-600/2
\n        +_progressBar->getScaleY()
_progressBar->getContentSize().height
\n        +6001(1-_progressBar->getScaleY()));
\n    return true;
\n}
\n 
\nbool XGridView::initKeyListen()
\n{
\n    auto listener = EventListenerKeyboard::create();
\n    IF_NULL_RETURN_FALSE(listener);
\n    listener->onKeyReleased = ={
\n            keyHandler(key);
\n    };
\n    this->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener,this);
\n    return true;
\n}
\n 
\nvoid XGridView::keyHandler(EventKeyboard::KeyCode key )
\n{
\n    updateSceenStateByKey(key);
\n    updateBySceenState();
\n}
\n 
\nvoid XGridView::initStateMatrix()
\n{
\n    IF_NOEMPTY_CLEAR(_screenState);
\n    for (unsigned int i = 0; i < _pageY; i++)
\n    {
\n         
\n        for(unsigned int j = 0;j < _pageX; j++)
\n        {
\n            itemState state;
\n            state.idx = j;
\n            state.cellIdx = i;
\n            state.isSelected = state.idx==_selectedItmIdx&&state.cellIdx == _currentCellIdx;
\n            state.posX = j;
\n            state.posY = i;
\n            state.posType = getPosTypeByXY(j,i);
\n            _screenState.push_back(state);
\n        }
\n    }
\n}
\n 
\nbool XGridView::isSelectedByIdx( ssize_t mIdx ) const
\n{
\n    for(auto e:_screenState)
\n    {
\n        if(mIdx==e.idx&&true==e.isSelected)
\n            return true;
\n    }
\n    return false;
\n}
\n 
\nvoid XGridView::updateSceenStateByKey( EventKeyboard::KeyCode key )
\n{
\n    auto state = getSelectedItemState();
\n    if(!state)
\n    {
\n        //do something init screenState
\n        //...
\n        return;
\n    }
\n    POS_TYPE p = state->posType;
\n   auto change_Type = getChangeType(p,key);
\n   updateMoveFoucs(key,p);
\n   auto maxIdx = _screenState.size();
\n   switch (change_Type)
\n   {
\n   case CHANGE_TYPE::LEFT:
\n       log(“left”);
\n       _selectedItmIdx–;
\n       for (unsigned int i = 0;i<maxidx;i++)
\n       {
\n           _screenState[i].isSelected = 
\n               _screenState[i].idx==_selectedItmIdx&&
\n               _screenState[i].cellIdx == _currentCellIdx;
\n       }
\n       _mTable->updateCellAtIndex(_currentCellIdx);
\n       break;
\n   case CHANGE_TYPE::RIGHT:
\n       log(“right”);
\n        _selectedItmIdx++;
\n       for (unsigned int i = 0;i<maxidx;i++)
\n       {
\n           _screenState[i].isSelected = 
\n               _screenState[i].idx==_selectedItmIdx&&
\n               _screenState[i].cellIdx == _currentCellIdx;
\n       }
\n        _mTable->updateCellAtIndex(_currentCellIdx);
\n       break;
\n   case CHANGE_TYPE::UP:
\n       log(“up”);
\n       _currentCellIdx –;
\n       for (unsigned int i = 0;i<maxidx;i++)
\n       {   
\n           _screenState[i].isSelected = 
\n               _screenState[i].idx==_selectedItmIdx&&
\n               _screenState[i].cellIdx == _currentCellIdx;
\n       }
\n        _mTable->updateCellAtIndex(_currentCellIdx+1);
\n        _mTable->updateCellAtIndex(_currentCellIdx);
\n       break;
\n   case CHANGE_TYPE::DOWN:
\n       log(“down”);
\n       _currentCellIdx++;
\n       for (unsigned int i = 0;i<maxidx;i++)
\n       {
\n           _screenState[i].isSelected = 
\n               _screenState[i].idx==_selectedItmIdx&&
\n               _screenState[i].cellIdx == _currentCellIdx;
\n       }
\n        _mTable->updateCellAtIndex(_currentCellIdx-1);
\n         _mTable->updateCellAtIndex(_currentCellIdx);
\n       break;
\n   case CHANGE_TYPE::UP_SCROLL:
\n       if (!_keyContrl)
\n       {
\n           return;
\n       }
\n       if(_keyContrl)
\n       {
\n           _keyContrl = false;
\n           scheduleOnce(schedule_selector(XGridView::keyListenDelay), 0.05f);
\n 
\n       }
\n       log(“up_scroll”);
\n       _currentCellIdx–;
\n        
\n       for (unsigned int i = 0;i<maxidx;i++)
\n       {
\n               _screenState[i].cellIdx--;
\n               _screenState[i].isSelected = 
\n                   _screenState[i].idx==_selectedItmIdx&&
\n                   _screenState[i].cellIdx == _currentCellIdx;
\n                
\n       }
\n        _scrollTime = getCurrentMillionTime();
\n        _mTable->scrollToCellIndex(_currentCellIdx+2);
\n        _mTable->updateCellAtIndex(_currentCellIdx+2);
\n        _mTable->updateCellAtIndex(_currentCellIdx+1);
\n        _mTable->updateCellAtIndex(_currentCellIdx);
\n       return;
\n   case CHANGE_TYPE::DOWN_SCROLL:
\n       if (!_keyContrl)
\n       {
\n           return;
\n       }
\n       if(_keyContrl)
\n       {
\n           _keyContrl = false;
\n           scheduleOnce(schedule_selector(XGridView::keyListenDelay), 0.05f);
\n 
\n       }
\n       log(“down_scroll”);
\n       _currentCellIdx ++;
\n       
\n       for (unsigned int i = 0;i<maxidx;i++)
\n       {
\n           _screenState[i].cellIdx++;
\n           _screenState[i].isSelected = 
\n               _screenState[i].idx==_selectedItmIdx&&
\n               _screenState[i].cellIdx == _currentCellIdx;
\n       }
\n 
\n        _scrollTime = getCurrentMillionTime();
\n        _mTable->scrollToCellIndex(_currentCellIdx);
\n        _mTable->updateCellAtIndex(_currentCellIdx-2);
\n        _mTable->updateCellAtIndex(_currentCellIdx-1);
\n        _mTable->updateCellAtIndex(_currentCellIdx);
\n       return;
\n   case CHANGE_TYPE::NOTHING:
\n       log(“nothing”);
\n       return;
\n   default:
\n       log(“default”);
\n       return;
\n   }
\n   //_mTable->reloadData();
\n}
\n 
\nPOS_TYPE XGridView::getPosTypeByXY( unsigned int X_i,unsigned int Y_j )
\n{
\n 
\n    //
\n    if(0==X_i&&0==Y_j)
\n        return POS_TYPE::TYPE_0;
\n    if(0<x_i&&x_i<_pagex-1&&0==y_j)
\n        return POS_TYPE::TYPE_1;
\n    if(_pageX-1==X_i&&0==Y_j)
\n        return POS_TYPE::TYPE_2;
\n    //
\n    if(0==X_i&&0<y_j&&_pagey-1>Y_j)
\n        return POS_TYPE::TYPE_3;
\n    if(0<x_i&&x_i<_pagex-1&&0<y_j&&_pagey-1>Y_j)
\n        return POS_TYPE::TYPE_4;
\n    if(_pageX-1==X_i&&0<y_j&&_pagey-1>Y_j)
\n        return POS_TYPE::TYPE_5;
\n    //
\n    if(0==X_i&&_pageY-1==Y_j)
\n        return POS_TYPE::TYPE_6;
\n    if(0<x_i&&x_i<_pagex-1&&_pagey-1==y_j)
\n        return POS_TYPE::TYPE_7;
\n    if(_pageX-1==X_i&&_pageY-1==Y_j)
\n        return POS_TYPE::TYPE_8;  
\n    return POS_TYPE::TYPE_9;
\n}
\n 
\nitemState XGridView::getSelectedItemState() const
\n{
\n    for(auto e:_screenState)
\n    {
\n        if(e.isSelected)
\n            return &e;
\n    }
\n    return nullptr;
\n}
\n 
\nCHANGE_TYPE XGridView::getChangeType( POS_TYPE posType ,EventKeyboard::KeyCode key)
\n{
\n    auto pos = (int)posType;
\n     
\n    switch(key)
\n    {
\n    case EventKeyboard::KeyCode(KEY_LEFT):
\n        if (1==pos||2==pos||4==pos||5==pos||7==pos||8==pos)
\n        {
\n            return CHANGE_TYPE::LEFT;
\n        }
\n                break;
\n    case EventKeyboard::KeyCode(KEY_RIGHT):
\n        if (0==pos||1==pos||3==pos||4==pos||6==pos||7==pos)
\n        {
\n            return CHANGE_TYPE::RIGHT;
\n        }
\n                break;
\n    case EventKeyboard::KeyCode(KEY_UP):
\n        if (3==pos||4==pos||5==pos||6==pos||7==pos||8==pos)
\n        {
\n            return CHANGE_TYPE::UP;
\n        }
\n        if(0==pos||1==pos||2==pos)
\n        {
\n            if(_currentCellIdx == 0)
\n                break;
\n            return CHANGE_TYPE::UP_SCROLL;
\n        }
\n                break;
\n    case EventKeyboard::KeyCode(KEY_DOWN):
\n        if (0==pos||1==pos||2==pos||3==pos||4==pos||5==pos)
\n        {
\n            return CHANGE_TYPE::DOWN;
\n        }
\n        if(6==pos||7==pos||8==pos)
\n        {
\n            if(_currentCellIdx == _cellTotalNum-1)
\n                break;
\n            return CHANGE_TYPE::DOWN_SCROLL;
\n        }
\n                break;
\n    }
\n    return CHANGE_TYPE::NOTHING;
\n 
\n}
\n 
\nvoid XGridView::updateBySceenState()
\n{
\n    //_mTable->reloadData();
\n}
\n 
\n 
\nvoid XGridView::deCodeJsonById()
\n{
\n     
\n   // do some thing to initialize data
\n   //…
\n    _isdecoded = true;
\n}
\n 
\nvoid XGridView::handlerValueChangge(float t)
\n{
\n    for (unsigned char i=0;i<once_load_num;i++)
\n    {
\n        if (_firstPageUpdate[i])
\n        {
\n            _firstPageUpdate[i]= false;
\n            _mTable->updateCellAtIndex(i/_pageX);
\n        }
\n             
\n    }
\n}
\n 
\nvoid XGridView::update( float t )
\n{
\n    Layer::update(t);
\n     
\n}
\n 
\nvoid XGridView::onEnterTransitionDidFinish()
\n{
\n    Layer::onEnterTransitionDidFinish();
\n    scheduleUpdate();
\n    schedule(schedule_selector(XGridView::updateDalay),0.2f);
\n}
\n 
\nbool XGridView::initMoveFoucus()
\n{
\n    _moveFoucus = Sprite::create(“grid/focus.png”);
\n    IF_NULL_RETURN_FALSE(_moveFoucus);
\n    addChild(_moveFoucus);
\n    _moveFoucus->setAnchorPoint(Vec2::ANCHOR_BOTTOM_LEFT);
\n    //_moveFoucus->setPosition(500,500);
\n    for (unsigned char i=0;i<9;i++)
\n    {
\n        _pos[i] = Vec2(90-10-5+i%3
600,1080-172-200-10-i/3320);
\n    }
\n    _moveFoucus->setPosition(_pos[0]);
\n    return true;
\n}
\n 
\nvoid XGridView::updateMoveFoucs( EventKeyboard::KeyCode key,POS_TYPE pos )
\n{
\n        int mPos = (int)pos;
\n    float time = 0.1f;
\n    int nextPos = -1;
\n    switch (key)
\n    {
\n    case EventKeyboard::KeyCode(KEY_LEFT):
\n        if (mPos%_pageX)
\n        {
\n            nextPos = mPos – 1;
\n        }
\n        break;
\n    case EventKeyboard::KeyCode(KEY_RIGHT):
\n        if ((mPos+1)%_pageX)
\n        {
\n            nextPos = mPos + 1;
\n        }
\n        break;
\n    case EventKeyboard::KeyCode(KEY_UP):
\n        if (mPos>_pageX-1)
\n        {
\n            nextPos = mPos – _pageX;
\n        }
\n        break;
\n    case EventKeyboard::KeyCode(KEY_DOWN):
\n        if (mPos<_pageX
(_pageY-1))
\n        {
\n            nextPos = mPos + _pageX;
\n        }
\n        break;
\n    default:
\n        break;
\n    }
\n    if(-1!=nextPos)
\n    {
\n        _moveFoucus->stopAllActions();
\n        _moveFoucus->runAction(MoveTo::create(time,_pos[nextPos]));
\n    }
\n}
\n 
\nvoid XGridView::loadPageNumData(unsigned int cellIndx)
\n{
\n     
\n     //

作者信息

menghao

menghao

共发布了 3994 篇文章