Cocos2d-x 3.2键盘操控列表页的初步实现
一 、思路\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\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(j600+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\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\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\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 +600percent(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%3600,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 //