//获取控件
vector<string> vecNodeName = {"PanelClassListItem","PanelClass"};
for (int i=0; i < vecNodeName.size(); i++) {
auto node = Helper::seekWidgetByName(static_cast<Widget*>(mUI), vecNodeName[i]);
if(vecNodeName[i] == "PanelClassListItem"){
//增加一个引用,不被释放;移除父节点
node->retain();
node->removeFromParent();
}
else if(vecNodeName[i] == "lvClass")
{
ListView* lv = static_cast<cocos2d::ui::ListView*>(node);
lv->removeAllItems();
lv->setScrollBarEnabled(false);
lv->setPropagateTouchEvents(true);
lv->setSwallowTouches(false);
}
mapWidget[vecNodeName[i]] = node;
}
//增加Item到ListView中
int size = 26;
int itemCount = std::ceil(size/4.0);
for (int i=0; i<itemCount; i++) {
auto item = mapWidget["PanelClassListItem"]->clone();
for(int j=0;j<4;j++){
auto cell = (Layout*)item->getChildByName("panelClassItem" + StringUtils::toString(j));
Text* txt = (Text*)cell->getChildByName("txtName");
int tag = i*4+j;
if(tag + 1 > size){
cell->setTag(-1);
cell->setVisible(false);
}else{
cell->setTag(tag);
cell->setName("Class" + StringUtils::toString(tag));
cell->setVisible(true);
txt->setString(StringUtils::toString(tag));
cell->getChildByName("imgSelected")->setVisible(false);
//对每个Cell增加触发事件,这个Cell的全球坐标触摸移动小于10像素时表示点击了此Cell事件
cell->addTouchEventListener(CC_CALLBACK_2(BindClassV2::listCellTouchEvent, this));
mapWidgetClass[tag] = cell;
}
}
temp->pushBackCustomItem(item);
}
//ListView滑动小于10像素时表示点击事件,滑动时不会触发点击事件
void BindClassV2::listCellTouchEvent(Ref* pSender, Widget::TouchEventType eventType)
{
ImageView* cb = (ImageView*)pSender;
if (eventType == Widget::TouchEventType::BEGAN) {
touchBeginPos = cb->convertToWorldSpace(Vec2(0, 0));
maxDistance = 0;
CCLOG("BEGAN");
} else if (eventType == Widget::TouchEventType::MOVED) {
Vec2 newPos = cb->convertToWorldSpace(Vec2(0, 0));
float dis = newPos.distance(touchBeginPos);
if(dis > maxDistance){
maxDistance = dis;
}
log("MOVED--%f",dis);
} else if (eventType == Widget::TouchEventType::ENDED) {
if (maxDistance < 10) {
handleGrade(cb);
}
CCLOG("ENDED");
} else if (eventType == Widget::TouchEventType::CANCELED) {
CCLOG("CANCELED");
}
}
//Cell的点击事件
void BindClassV2::handleGrade(ImageView* img)
{
int index = img->getTag();
if (curClassIndex == index) {
//已经选中它,要取消选中
curClassIndex = -1;
img->getChildByName("imgSelected")->setVisible(false);
} else {
if(curClassIndex != -1){
//取消上次的选中
mapWidgetClass[curClassIndex]->getChildByName("imgSelected")->setVisible(false);
}
curClassIndex = index;
img->getChildByName("imgSelected")->setVisible(true);
SoundManager::getInstance()->playSoundEffect("music/snd_mark.mp3");
}
}
效果图