有图有真相,首先上实现了的效果。
由于要加载较多数据,那么为了使得界面更近流畅,我采用tableVIEw,其中他的Cell是可以复用的。创建10000个也是秒秒钟的事情。
那么使用上下排列的tableVIEw,每个cell自定义三个Item即可,当然也可以N个,可以自己写好接口。
由于我们想使得tableVIEw可以滚动到指定的cell位置,也就是一格一格滚动,那么我们最好自定义一个tableVIEw继承于系统的tableVIEw.
如果你对于tableVIEw不太熟悉,建议先看官方Testcpp例子.
如果你比较熟悉,那么我就不废话,继续往下讲了。
我们先来自定义一个tableVIEwcell。也就是自定义一行的内容。我相信这个非常简单。
四、准备工作我们先来自定义一个tableVIEwcell。也就是自定义一行的内容。我相信这个非常简单。
cell头文件
class XtableVIEwCell : public cocos2d::extension::tableVIEwCell{public: XtableVIEwCell(); virtual ~XtableVIEwCell(); CREATE_FUNC(XtableVIEwCell); /************************************************************************/ /* update item by data */ /************************************************************************/ bool updateItemData(const unsigned int tag,const std::string icon,const std::string name,const std::string size,const std::string downnum,const std::string score); bool setItemSelected(const unsigned int tag,bool isSeleted);CC_CONSTRUCTOR_ACCESS: bool init(); //bool init bool initLayout(); voID update(float t);private: cocos2d::Size _cellSize; //the size of cell unsigned char _itemNum; // the number of item};
cell .源文件
//////////////////////////////////////////////////////////////////////////////////////////////***************************CustomtableVIEwCell Class**************************************/////////////////////////////////////////////////////////////////////////////////////////////XtableVIEwCell::XtableVIEwCell():_itemNum(3),_cellSize(Size(1920,275)){}XtableVIEwCell::~XtableVIEwCell(){}bool XtableVIEwCell::init(){ IF_NulL_RETURN_FALSE(Node::init()); IF_NulL_RETURN_FALSE(initLayout()); //scheduleUpdate(); //resumeSchedulerAndActions(); return true;}bool XtableVIEwCell::initLayout(){ auto lout = ui::Layout::create(); IF_NulL_RETURN_FALSE(lout); lout->setLayoutType(ui::Layout::Type::absolute); lout->settouchEnabled(true); lout->setLoopFocus(false); lout->setPassFocustochild(true); lout->setContentSize(Size(_cellSize.wIDth,200.0f)); this->addChild(lout); lout->setTag(100); lout->setAnchorPoint(Vec2::ANCHOR_BottOM_left); lout->setposition(Vec2(0,75)); for(int j =0;j<_itemNum;j++) { const std::string txt = StringUtils::format("%dt%d",j);//名称后面得重新修改 GrIDItem* item = GrIDItem::create(); IF_NulL_RETURN_FALSE(item); item->setposition(Vec2(j*600+90,0)); item->setname(txt); lout->addChild(item,1,j); } return true;}voID XtableVIEwCell::update( float t ){ log("XtableVIEwCell::update");}bool XtableVIEwCell::updateItemData( const unsigned int tag,const std::string score ){ auto lout = this->getChildByTag(100); IF_NulL_RETURN_FALSE(lout); auto item = (GrIDItem*)lout->getChildByTag(tag); IF_NulL_RETURN_FALSE(item); if(""!=icon) { item->updateIcon(icon); } if(""!=name) { item->updatename(name); } if(""!=size) { item->updateSize(size); } if(""!=downnum) { item->updateDownNum(downnum); } if(""!=score) { item->updatescore(score); } return true;}bool XtableVIEwCell::setItemSelected( const unsigned int tag,bool isSeleted ){ auto lout = this->getChildByTag(100); IF_NulL_RETURN_FALSE(lout); auto item = (GrIDItem*)lout->getChildByTag(tag); IF_NulL_RETURN_FALSE(item); item->setSelected(isSeleted); return true;}
里面都实现了什么,其实就是简单的添加了三个自定义Item.
然后,我们自定义一个tableVIEw实现了两个方法。
一个是去实现滚动到指定cell的方法。
另外一个是我使用触摸的时候需要获得当前使用的cell去判断哪个Item位置位于触摸位置。
我们这里只讲键盘的。那么你可能就用不到这个函数了。
代码如下:
class XtableVIEw : public cocos2d::extension::tableVIEw{public: /** * @brIEf scroll to the Designated cell * @param index --- the IDx of Designated cell **/ voID scrollToCellindex(ssize_t index); /*************************************************** * @decripition if you need Analyzing touch item,* maby you will use this function to get used cell ****************************************************/ cocos2d::Vector<cocos2d::extension::tableVIEwCell*> getCurrentCells() const;};
//////////////////////////////////////////////////////////////////////////////////////////////***************************XtableVIEw Class**************************************/////////////////////////////////////////////////////////////////////////////////////////////voID XtableVIEw::scrollToCellindex( ssize_t index ){ this->getContainer()->stopAllActions(); Vec2 offset = _offsetFromIndex(index)*-1; Vec2 maxOffSet = this->maxContainerOffset(); Vec2 minOffSet = this->minContainerOffset(); float offX = MIN(offset.x,maxOffSet.x); offX = MAX(offX,minOffSet.x); float offY = MIN(offset.y,maxOffSet.y); offY = MAX(offY,minOffSet.y); this->setContentOffset(Vec2(offX,offY),true);}cocos2d::Vector<cocos2d::extension::tableVIEwCell*> XtableVIEw::getCurrentCells() const{ log("used cell count is %d",_cellsUsed.size()); return this->_cellsUsed;}
好了,那么接下来的重点是列表页的实现。
五、页面具体实现由于篇幅受限,代码内容比较多,相信大家自己分析就能理解,那么先就不废话了,先上代码吧。不懂的或者有好的建议希望可以留言讨论。
头文件。(注:具体数据录入,我自己的已删除,需要的可以添加自己的数据,现在展示的基本只是一个界面)
enum class POS_TYPE{ TYPE_0,// right,down and scroll up TYPE_1,//left,right,down and scroll up TYPE_2,down and scroll up TYPE_3,up,down TYPE_4,down TYPE_5,down TYPE_6,and scroll down TYPE_7,and scroll down TYPE_8,and scroll down TYPE_9 // can do nothing};enum class CHANGE_TYPE{ left,RIGHT,UP,DOWN,UP_SCRolL,DOWN_SCRolL,nothing};typedef struct { //item IDx,and start from value 0 to _pageX unsigned char IDx; //cell IDx unsigned int cellIDx; // selected state bool isSelected; /***************************************** * pos in screen like a matrix,such as * (0,0),(1,(2,0) * (0,1),1) * (0,2),2) *****************************************/ unsigned char posX; unsigned char posY; POS_TYPE posType;}itemState;class XGrIDVIEw :public cocos2d::Layer,public cocos2d::extension::tableVIEwDataSource,public cocos2d::extension::tableVIEwDelegate{ public: CREATE_FUNC(XGrIDVIEw); /*** *@brIEf create a GrIDVIEw *@ ***/ virtual voID scrollVIEwDIDScroll(cocos2d::extension::ScrollVIEw* vIEw); virtual voID scrollVIEwDIDZoom(cocos2d::extension::ScrollVIEw* vIEw); virtual voID tableCelltouched(cocos2d::extension::tableVIEw* table,cocos2d::extension::tableVIEwCell* cell); virtual cocos2d::Size tableCellSizeforIndex(cocos2d::extension::tableVIEw *table,ssize_t IDx); virtual cocos2d::extension::tableVIEwCell* tableCellAtIndex(cocos2d::extension::tableVIEw *table,ssize_t IDx); virtual ssize_t numberOfCellsIntableVIEw(cocos2d::extension::tableVIEw *table);CC_CONSTRUCTOR_ACCESS: XGrIDVIEw(); virtual ~XGrIDVIEw(); virtual bool init(); virtual bool initWithDatas(ssize_t cellTotalNum,const cocos2d::Size tableSize); virtual bool initMoveFoucus(); virtual bool inittable(); virtual bool initProgressbar(); virtual bool initKeyListen(); virtual voID initStateMatrix(); virtual voID keyHandler(cocos2d::EventKeyboard::KeyCode key); virtual bool ontouchBegan(cocos2d::touch *touch,cocos2d::Event *unused_event); virtual voID ontouchmoved(cocos2d::touch *touch,cocos2d::Event *unused_event); virtual voID ontouchended(cocos2d::touch *touch,cocos2d::Event *unused_event); virtual voID ontouchCancelled(cocos2d::touch *touch,cocos2d::Event *unused_event); virtual voID ListenItemtouch(cocos2d::touch *touch,cocos2d::Event *unused_event); voID updateBySceenState(); virtual voID isItemtouched(cocos2d::Node* item,const cocos2d::Vec2 point); virtual voID deCodeByJson(); voID update(float t); virtual voID onEnterTransitionDIDFinish(); //some model function bool isSelectedByIDx(ssize_t mIDx) const; voID updateSceenStateByKey(cocos2d::EventKeyboard::KeyCode key); POS_TYPE getPosTypeByXY(unsigned int X_i,unsigned int Y_j); itemState* getSelectedItemState() const; CHANGE_TYPE getChangeType(POS_TYPE posType,cocos2d::EventKeyboard::KeyCode key); voID updateMoveFoucs(cocos2d::EventKeyboard::KeyCode key,POS_TYPE pos); voID loadPageNumData(unsigned int cellindx); voID keyListenDelay(float t); voID updateDalay(float t); voID onExit() overrIDe; // update cell at IDx voID updateCellAtIDx(ssize_t IDx); // update Item At IDx voID updateItemAtIDx(ssize_t IDx); private: XtableVIEw* _mtable; cocos2d::Sprite* _progressbar; ssize_t _cellTotalNum; cocos2d::Size _tableSize; ssize_t _pageX; ssize_t _pageY; std::vector<std::string> _iconimg; std::vector<std::string> _appname; std::vector<std::string> _appSize; std::vector<std::string> _downNum; std::vector<std::string> _appscore; //the state of screen,true means selected and false means unselected std::vector<itemState> _screenState; //the cell of selected IDx ssize_t _currentCellIDx; //item IDx which in cell unsigned char _selectedItmIDx; bool _isdecoded; unsigned int _itemTotalNum; std::atomic_bool _firstPageUpdate[9]; cocos2d::Vec2 _pos[9]; cocos2d::Sprite* _moveFoucus; bool _keyContrl; long _scrollTime; bool _updateCell;};源文件
USING_NS_CC;USING_NS_CC_EXT;char* dataIndex[]={ "allnum","appico",//APP ICO Image "appTitle",//APP name "downnum",//APP Down times "score",//APP score "appSize" //APP size};XGrIDVIEw::XGrIDVIEw():_mtable(nullptr),_progressbar(nullptr),_cellTotalNum(100),_tableSize(Size(1920.0f,960.0f)),_moveFoucus(nullptr),_pageX(3),_pageY(3),_grIDID(0),_isdecoded(false),_keyContrl(true),_currentCellIDx(0),_selectedItmIDx(0),_itemTotalNum(300),_loadNum(0),_scrollTime(0L),_updateCell(true){ }XGrIDVIEw::~XGrIDVIEw(){ CC_SAFE_RELEASE(_mtable); CC_SAFE_RELEASE(_progressbar);}bool XGrIDVIEw::init(){ IF_RETURN_FALSE(!initWithDatas(_cellTotalNum,_tableSize)); return true;}bool XGrIDVIEw::initWithDatas(ssize_t cellTotalNum,const Size tableSize ){ IF_NulL_RETURN_FALSE(Layer::init()); setData(_Json); _cellTotalNum = cellTotalNum; _tableSize = tableSize; IF_NulL_RETURN_FALSE(initKeyListen()); IF_NulL_RETURN_FALSE(initMoveFoucus()); IF_NulL_RETURN_FALSE(inittable()); IF_NulL_RETURN_FALSE(initProgressbar()); initStateMatrix(); deCodeJsonByID(); return true;}voID XGrIDVIEw::tableCelltouched(tableVIEw* table,tableVIEwCell* cell ){ log("cell touched at index: %ld",cell->getIDx()); auto lout = (ui::Layout*)cell->getChildByTag(100); IF_RETURN(!lout); for(auto &item : lout->getChildren()) { if(!item) continue; else { if(item==lout->getCurrentFocusedWidget(true)) { ((GrIDItem*)item)->setSelected(true); //_selectedIDx = cell->getIDx()*_pageX+item->getTag(); } else { ((GrIDItem*)item)->setSelected(false); } } }}Size XGrIDVIEw::tableCellSizeforIndex(tableVIEw *table,ssize_t IDx ){ return Size(_tableSize.wIDth,_tableSize.height/_pageY);}tableVIEwCell* XGrIDVIEw::tableCellAtIndex(tableVIEw *table,ssize_t IDx ){ auto string = String::createWithFormat("%ld",IDx); tableVIEwCell *cell = table->dequeueCell(); if (!cell) { cell = XtableVIEwCell::create(); IF_RETURN_P(!cell,nullptr); cell->autorelease(); return cell; for(unsigned char i=0;i<_pageX;i++) { IF_NulL_CONTINUE(_isdecoded); ssize_t itemIDx = IDx*_pageX+i; IF_CONTINUE(itemIDx>_iconimg.size()-1||itemIDx>_appname.size()-1); ((XtableVIEwCell*)cell)->updateItemData(i,_iconimg.at(itemIDx),_appname.at(itemIDx),"5.03M","","7.6"); ((XtableVIEwCell*)cell)->setItemSelected(i,IDx==_currentCellIDx&&i==_selectedItmIDx); } auto label = Label::createWithSystemFont(string->getCString(),"Helvetica",40.0); IF_NulL_RETURN_P(label,cell); label->setposition(Vec2::ZERO); label->setAnchorPoint(Vec2::ZERO); label->setTag(123); cell->addChild(label); } else { auto _cellChild = cell->getChildByTag(100); for(unsigned char i=0;i<_pageX;i++) { IF_NulL_CONTINUE(_isdecoded); ssize_t itemIDx = IDx*_pageX+i; IF_CONTINUE(itemIDx>_iconimg.size()-1||itemIDx>_appname.size()-1); ((XtableVIEwCell*)cell)->updateItemData(i,IDx==_currentCellIDx&&i==_selectedItmIDx); } auto label = (Label*)cell->getChildByTag(123); IF_RETURN_P(!label,cell); label->setString(string->getCString()); } return cell;}ssize_t XGrIDVIEw::numberOfCellsIntableVIEw(tableVIEw *table ){ return _cellTotalNum;}bool XGrIDVIEw::inittable(){ _mtable = (XtableVIEw*)tableVIEw::create(this,_tableSize); IF_RETURN_FALSE(!_mtable); _mtable->setDirection(ScrollVIEw::Direction::VERTICAL); _mtable->setDelegate(this); this->addChild(_mtable); _mtable->setVerticalFillOrder(tableVIEw::VerticalFillOrder::top_DOWN); _mtable->reloadData(); return true;}voID XGrIDVIEw::scrollVIEwDIDScroll( cocos2d::extension::ScrollVIEw* vIEw ){ Vec2 pos = vIEw->getContentOffset(); Vec2 _pos = vIEw->getContentSize()-vIEw->getVIEwSize(); float percent = -(pos.y/_pos.y); // log("scroll percent is : %f",percent); IF_NulL_RETURN(_progressbar); _progressbar->setpositionY(960/2-600/2 +_progressbar->getScaleY()*_progressbar->getContentSize().height +600*percent*(1-_progressbar->getScaleY()));}voID XGrIDVIEw::scrollVIEwDIDZoom( cocos2d::extension::ScrollVIEw* vIEw ){}bool XGrIDVIEw::ontouchBegan( touch *touch,Event *unused_event ){ return true;}voID XGrIDVIEw::ontouchmoved( touch *touch,Event *unused_event ){}voID XGrIDVIEw::ontouchended( touch *touch,Event *unused_event ){ ListenItemtouch(touch,unused_event);}voID XGrIDVIEw::ontouchCancelled( touch *touch,Event *unused_event ){}voID XGrIDVIEw::ListenItemtouch( touch *touch,Event *unused_event ){ auto touchPoint = touch->getLocationInVIEw(); touchPoint = Director::getInstance()->convertToGL(touchPoint); for(auto &e:_mtable->getCurrentCells()) { IF_NulL_CONTINUE(e); log("cell[%d]",e->getIDx()); auto lout = e->getChildByTag(100); IF_NulL_CONTINUE(lout); if(dynamic_cast<ui::Layout*>(lout)) { for (auto item:((ui::Layout*)lout)->getChildren()) { isItemtouched(item,touchPoint); } } }}voID XGrIDVIEw::isItemtouched( cocos2d::Node* item,const cocos2d::Vec2 point ){ IF_RETURN(!item); auto gItem = dynamic_cast<GrIDItem*>(item); IF_RETURN(!gItem); auto acP = gItem->getAnchorPoint();//item锚点 auto itemPos = gItem->getposition();//item相对父容器的pos itemPos = gItem->getParent()->convertToWorldspaceAR(itemPos);//相对于世界的位置 auto itemSize = gItem->getContentSize(); auto itemRect = Rect(itemPos.x,itemPos.y,itemSize.wIDth,itemSize.height); if(itemRect.containsPoint(point)) { gItem->setSelected(true); //_selectedIDx = gItem->getIDx(); //log("_selectedIDx=%d",_selectedIDx); } else { gItem->setSelected(false); }}bool XGrIDVIEw::initProgressbar(){ auto barBg = Sprite::create("grID/progress_bg.png"); IF_NulL_RETURN_FALSE(barBg); barBg->setAnchorPoint(Vec2::ANCHOR_BottOM_left); barBg->setposition(90+600+600+500+80,960/2-600/2); addChild(barBg); _progressbar = Sprite::create("grID/progress_pre.png"); IF_NulL_RETURN_FALSE(_progressbar); _progressbar->setAnchorPoint(Vec2::ANCHOR_top_left); addChild(_progressbar); float scaleY = 1; if(_cellTotalNum>_pageY) { //float s = _pageY/_cellTotalNum; scaleY = MAX(_pageY/(_cellTotalNum*1.0f),0.02f); } _progressbar->setScaleY(scaleY); _progressbar->setposition(90+600+600+500+80,960/2-600/2 +_progressbar->getScaleY()*_progressbar->getContentSize().height +600*1*(1-_progressbar->getScaleY())); return true;}bool XGrIDVIEw::initKeyListen(){ auto Listener = EventListenerKeyboard::create(); IF_NulL_RETURN_FALSE(Listener); Listener->onkeyreleased = [=](EventKeyboard::KeyCode key,Event* event){ keyHandler(key); }; this->getEventdispatcher()->addEventListenerWithSceneGraPHPriority(Listener,this); return true;}voID XGrIDVIEw::keyHandler(EventKeyboard::KeyCode key ){ updateSceenStateByKey(key); updateBySceenState();}voID XGrIDVIEw::initStateMatrix(){ IF_NOEMPTY_CLEAR(_screenState); for (unsigned int i = 0; i < _pageY; i++) { for(unsigned int j = 0;j < _pageX; j++) { itemState state; state.IDx = j; state.cellIDx = i; state.isSelected = state.IDx==_selectedItmIDx&&state.cellIDx == _currentCellIDx; state.posX = j; state.posY = i; state.posType = getPosTypeByXY(j,i); _screenState.push_back(state); } }}bool XGrIDVIEw::isSelectedByIDx( ssize_t mIDx ) const{ for(auto e:_screenState) { if(mIDx==e.IDx&&true==e.isSelected) return true; } return false;}voID XGrIDVIEw::updateSceenStateByKey( EventKeyboard::KeyCode key ){ auto state = getSelectedItemState(); if(!state) { //do something init screenState //... return; } POS_TYPE p = state->posType; auto change_Type = getChangeType(p,key); updateMoveFoucs(key,p); auto maxIDx = _screenState.size(); switch (change_Type) { case CHANGE_TYPE::left: log("left"); _selectedItmIDx--; for (unsigned int i = 0;i<maxIDx;i++) { _screenState[i].isSelected = _screenState[i].IDx==_selectedItmIDx&& _screenState[i].cellIDx == _currentCellIDx; } _mtable->updateCellAtIndex(_currentCellIDx); break; case CHANGE_TYPE::RIGHT: log("right"); _selectedItmIDx++; for (unsigned int i = 0;i<maxIDx;i++) { _screenState[i].isSelected = _screenState[i].IDx==_selectedItmIDx&& _screenState[i].cellIDx == _currentCellIDx; } _mtable->updateCellAtIndex(_currentCellIDx); break; case CHANGE_TYPE::UP: log("up"); _currentCellIDx --; for (unsigned int i = 0;i<maxIDx;i++) { _screenState[i].isSelected = _screenState[i].IDx==_selectedItmIDx&& _screenState[i].cellIDx == _currentCellIDx; } _mtable->updateCellAtIndex(_currentCellIDx+1); _mtable->updateCellAtIndex(_currentCellIDx); break; case CHANGE_TYPE::DOWN: log("down"); _currentCellIDx++; for (unsigned int i = 0;i<maxIDx;i++) { _screenState[i].isSelected = _screenState[i].IDx==_selectedItmIDx&& _screenState[i].cellIDx == _currentCellIDx; } _mtable->updateCellAtIndex(_currentCellIDx-1); _mtable->updateCellAtIndex(_currentCellIDx); break; case CHANGE_TYPE::UP_SCRolL: if (!_keyContrl) { return; } if(_keyContrl) { _keyContrl = false; scheduleOnce(schedule_selector(XGrIDVIEw::keyListenDelay),0.05f); } log("up_scroll"); _currentCellIDx--; for (unsigned int i = 0;i<maxIDx;i++) { _screenState[i].cellIDx--; _screenState[i].isSelected = _screenState[i].IDx==_selectedItmIDx&& _screenState[i].cellIDx == _currentCellIDx; } _scrollTime = getCurrentMillionTime(); _mtable->scrollToCellindex(_currentCellIDx+2); _mtable->updateCellAtIndex(_currentCellIDx+2); _mtable->updateCellAtIndex(_currentCellIDx+1); _mtable->updateCellAtIndex(_currentCellIDx); return; case CHANGE_TYPE::DOWN_SCRolL: if (!_keyContrl) { return; } if(_keyContrl) { _keyContrl = false; scheduleOnce(schedule_selector(XGrIDVIEw::keyListenDelay),0.05f); } log("down_scroll"); _currentCellIDx ++; for (unsigned int i = 0;i<maxIDx;i++) { _screenState[i].cellIDx++; _screenState[i].isSelected = _screenState[i].IDx==_selectedItmIDx&& _screenState[i].cellIDx == _currentCellIDx; } _scrollTime = getCurrentMillionTime(); _mtable->scrollToCellindex(_currentCellIDx); _mtable->updateCellAtIndex(_currentCellIDx-2); _mtable->updateCellAtIndex(_currentCellIDx-1); _mtable->updateCellAtIndex(_currentCellIDx); return; case CHANGE_TYPE::nothing: log("nothing"); return; default: log("default"); return; } //_mtable->reloadData();}POS_TYPE XGrIDVIEw::getPosTypeByXY( unsigned int X_i,unsigned int Y_j ){ // if(0==X_i&&0==Y_j) return POS_TYPE::TYPE_0; if(0<X_i&&X_i<_pageX-1&&0==Y_j) return POS_TYPE::TYPE_1; if(_pageX-1==X_i&&0==Y_j) return POS_TYPE::TYPE_2; // if(0==X_i&&0<Y_j&&_pageY-1>Y_j) return POS_TYPE::TYPE_3; if(0<X_i&&X_i<_pageX-1&&0<Y_j&&_pageY-1>Y_j) return POS_TYPE::TYPE_4; if(_pageX-1==X_i&&0<Y_j&&_pageY-1>Y_j) return POS_TYPE::TYPE_5; // if(0==X_i&&_pageY-1==Y_j) return POS_TYPE::TYPE_6; if(0<X_i&&X_i<_pageX-1&&_pageY-1==Y_j) return POS_TYPE::TYPE_7; if(_pageX-1==X_i&&_pageY-1==Y_j) return POS_TYPE::TYPE_8; return POS_TYPE::TYPE_9;}itemState* XGrIDVIEw::getSelectedItemState() const{ for(auto e:_screenState) { if(e.isSelected) return &e; } return nullptr;}CHANGE_TYPE XGrIDVIEw::getChangeType( POS_TYPE posType,EventKeyboard::KeyCode key){ auto pos = (int)posType; switch(key) { case EventKeyboard::KeyCode(KEY_left): if (1==pos||2==pos||4==pos||5==pos||7==pos||8==pos) { return CHANGE_TYPE::left; } break; case EventKeyboard::KeyCode(KEY_RIGHT): if (0==pos||1==pos||3==pos||4==pos||6==pos||7==pos) { return CHANGE_TYPE::RIGHT; } break; case EventKeyboard::KeyCode(KEY_UP): if (3==pos||4==pos||5==pos||6==pos||7==pos||8==pos) { return CHANGE_TYPE::UP; } if(0==pos||1==pos||2==pos) { if(_currentCellIDx == 0) break; return CHANGE_TYPE::UP_SCRolL; } break; case EventKeyboard::KeyCode(KEY_DOWN): if (0==pos||1==pos||2==pos||3==pos||4==pos||5==pos) { return CHANGE_TYPE::DOWN; } if(6==pos||7==pos||8==pos) { if(_currentCellIDx == _cellTotalNum-1) break; return CHANGE_TYPE::DOWN_SCRolL; } break; } return CHANGE_TYPE::nothing;}voID XGrIDVIEw::updateBySceenState(){ //_mtable->reloadData();}voID XGrIDVIEw::deCodeJsonByID(){ // do some thing to initialize data //... _isdecoded = true;}voID XGrIDVIEw::handlerValueChangge(float t){ for (unsigned char i=0;i<ONCE_LOAD_NUM;i++) { if (_firstPageUpdate[i]) { _firstPageUpdate[i]= false; _mtable->updateCellAtIndex(i/_pageX); } }}voID XGrIDVIEw::update( float t ){ Layer::update(t); }voID XGrIDVIEw::onEnterTransitionDIDFinish(){ Layer::onEnterTransitionDIDFinish(); scheduleUpdate(); schedule(schedule_selector(XGrIDVIEw::updateDalay),0.2f);}bool XGrIDVIEw::initMoveFoucus(){ _moveFoucus = Sprite::create("grID/focus.png"); IF_NulL_RETURN_FALSE(_moveFoucus); addChild(_moveFoucus); _moveFoucus->setAnchorPoint(Vec2::ANCHOR_BottOM_left); //_moveFoucus->setposition(500,500); for (unsigned char i=0;i<9;i++) { _pos[i] = Vec2(90-10-5+i%3*600,1080-172-200-10-i/3*320); } _moveFoucus->setposition(_pos[0]); return true;}voID XGrIDVIEw::updateMoveFoucs( EventKeyboard::KeyCode key,POS_TYPE pos ){ int mPos = (int)pos; float time = 0.1f; int nextPos = -1; switch (key) { case EventKeyboard::KeyCode(KEY_left): if (mPos%_pageX) { nextPos = mPos - 1; } break; case EventKeyboard::KeyCode(KEY_RIGHT): if ((mPos+1)%_pageX) { nextPos = mPos + 1; } break; case EventKeyboard::KeyCode(KEY_UP): if (mPos>_pageX-1) { nextPos = mPos - _pageX; } break; case EventKeyboard::KeyCode(KEY_DOWN): if (mPos<_pageX*(_pageY-1)) { nextPos = mPos + _pageX; } break; default: break; } if(-1!=nextPos) { _moveFoucus->stopAllActions(); _moveFoucus->runAction(Moveto::create(time,_pos[nextPos])); }}voID XGrIDVIEw::loadPageNumData(unsigned int cellindx){ //load data of cell }voID XGrIDVIEw::keyListenDelay( float t ){ _keyContrl = true;}voID XGrIDVIEw::updateDalay( float t ){ if(getCurrentMillionTime()-_scrollTime>500) { loadPageNumData(_currentCellIDx); }}voID XGrIDVIEw::onExit(){ NotificationCenter::getInstance()->removeAllObservers(this); this->unscheduleAllSelectors(); Layer::onExit();}voID XGrIDVIEw::updateCellAtIDx( ssize_t IDx ){ for (unsigned int i = IDx*_pageX;i<(IDx+1)*_pageX && i<_itemTotalNum;i++) { updateItemAtIDx(i); }}voID XGrIDVIEw::updateItemAtIDx( ssize_t IDx ){ //update data of item }
本文原创,如转载请注明原文地址。
http://blog.csdn.net/q229827701/article/details/40619697
总结以上是内存溢出为你收集整理的cocos2dx 3.2键盘 *** 控的列表页的初步实现全部内容,希望文章能够帮你解决cocos2dx 3.2键盘 *** 控的列表页的初步实现所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)