[Cocos2dx]ListView添加Item,滑动时不触发点击事件

//获取控件
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");
    }
}

效果图

猜你喜欢

转载自blog.csdn.net/ouyangshima/article/details/81569591
今日推荐