在官网demo中我们可以看到,滚动效果是由CCSprite精灵显示的,但是如果需要像手机app中滚动列表一样(如下图),点击在上面需要不同的图片效果显示,那么仅仅依靠CCSprite效果不是很好了:
研究了两天,发现了demo中的一些问题,实现可以有好几种方式,就是显示效果不一样,下面一一介绍:
(1.)使用CCSprite,创建时使用CCSprite,然后放置到cell中,不同状态就得依靠响应事件了,在ccTouchEnd(..,..)里面获得精灵,然后重新设置纹理。不过这种效果显示出来不是很自然。
if (m_iLastButtonID == cell->getIdx() )
{
if (cell->IsSelected())
{
cell->setSelected(false);
CCSpriteBatchNode *pnode = CCSpriteBatchNode::create("Images/back.png");
CCSprite *psprite = (CCSprite*)cell->getChildByTag(100);
psprite->setTexture(pnode->getTexture());
}else
{
cell->setSelected(true);
CCSpriteBatchNode *pnode = CCSpriteBatchNode::create("Images/backdown.png");
CCSprite *psprite = (CCSprite*)cell->getChildByTag(100);
psprite->setTexture(pnode->getTexture());
}
lastcell = cell;
}else
{
if (lastcell)
{
lastcell->setSelected(false);
CCSpriteBatchNode *plastnode = CCSpriteBatchNode::create("Images/back.png");
CCSprite *plastsprite = (CCSprite*)lastcell->getChildByTag(100);
plastsprite->setTexture(plastnode->getTexture());
}
cell->setSelected(true);
m_iLastButtonID = cell->getIdx();
CCSpriteBatchNode *pnode = CCSpriteBatchNode::create("Images/backdown.png");
CCSprite *psprite = (CCSprite*)cell->getChildByTag(100);
psprite->setTexture(pnode->getTexture());
lastcell = cell;
}
(2.)CCMenu,大家刚开始接触cocos2d-x工程时,直接运行程序就会显示一个closebutton,那个就是CCMenuItemImage和CCMenu结合的效果。
代码直接写在:CCTableViewCell* TableViewTestLayer::tableCellAtIndex(CCTableView *table, unsigned int idx)里,直接将里面CCSprite改成CCMenu就行。
问题出现了:第一,按钮有状态变化,但是列表拖动不了
第二,即使你自己在该CCLayer上面再加上一层虚拟的无界面的CCLayer1,在CCLayer1里面加上触摸事件,但是点击界面时依旧是CCMenu按钮响应,虚拟界面在按钮处是没有响应事件的。
原因:后来我去看了一些博客之后发现是优先级的问题,CCMenu的优先级太高了-128,我把整个cell都添加为一个按钮,所以cell的响应时间就被吞并掉了。我们如何处理这个问题呢。。。。http://blog.youkuaiyun.com/xujiezhige/article/details/8291995
这个问题折磨了整整半天,修改了很多CCTableView代码,想自己实现的,但是丢人,连原先的CCSprite也滚动不聊了,哎,不过中心查看底层发现很多东西,有兴趣的可以自己跟踪下。
(3.)CCControlButton,使用这个类需要using namespace CocosDenshion;这个效果会好点
CCScale9Sprite* btnNormal = CCScale9Sprite::create("Images/back.png");
CCScale9Sprite* btnSelected = CCScale9Sprite::create("Images/backdown.png");
CCLabelTTF *title = CCLabelTTF::create("","Marker Felt",30);
CCControlButton* controlBtn = CCControlButton::create(title,btnNormal);
controlBtn->setBackgroundSpriteForState(btnSelected,CCControlStateSelected);
controlBtn->addTargetWithActionForControlEvents(this,cccontrol_selector(TableViewTestLayer::touchDown),CCControlEventTouchDown);
controlBtn->setTitleColorForState(ccRED,CCControlStateHighlighted);
controlBtn->setPreferredSize(CCSize(272,344));
controlBtn->setAdjustBackgroundImage(false);
controlBtn->setAnchorPoint(ccp(0,0));
controlBtn->setPosition(ccp(0,0));
controlBtn->setTag(idx+300);
cell->addChild(controlBtn);
(4.)cocosStudio中的uibutton暂时没有实现。
对了,在cocos2d中有个可以改变优先级的函数:controlBtn->setDefaultTouchPriority(-200);
(5.)demo中存在的问题,有些位置影藏的部分点击了还有响应,如下图白色区域: