cocos2d-x支持长按的TableViewCell
原文请猛戳: 再次来聊一聊cocos2d-x的 TouchableTableViewCell::TouchableTableViewCell(): isValidTouched_(false),touchableNode_(nullptr) {} TouchableTableViewCell::~TouchableTableViewCell() {} bool TouchableTableViewCell::init() { if (!TableViewCell::init()) { return false; } return true; } void TouchableTableViewCell::initTouchListener() { auto touchListener = EventListenerTouchOneByOne::create(); CC_SAFE_RETAIN(touchListener); Rect validTouchedRect; validTouchedRect.size = touchableNode_->getContentSize(); touchListener->onTouchBegan = [=] (cocos2d::Touch* touch,cocos2d::Event* event) { if (touchableNode_ == nullptr) { return false; } auto touchLocation = touch->getLocation(); auto localLocation = touchableNode_->convertToNodeSpace(touchLocation); if (validTouchedRect.containsPoint(localLocation)) { isValidTouched_ = true; return true; } else { isValidTouched_ = false; return false; } }; touchListener->onTouchMoved = [=] (cocos2d::Touch* touch,cocos2d::Event* event) { auto touchLocation = touch->getLocation(); auto localLocation = touchableNode_->convertToNodeSpace(touchLocation); if (validTouchedRect.containsPoint(localLocation)) { isValidTouched_ = true; } else { isValidTouched_ = false; } }; touchListener->onTouchEnded = touchListener->onTouchMoved; touchListener->onTouchCancelled = touchListener->onTouchEnded; _eventDispatcher->addEventListenerWithSceneGraphPriority(touchListener,this); } void TouchableTableViewCell::setTouchableNode(cocos2d::Node* touchableNode) { touchableNode_ = touchableNode; initTouchListener(); } 使用时只需让实际的 另外,有时候我们需要让 const std::string LongTouchableTableViewCell::SCHEDULE_KEY = "LONG_TOUCHABLE_TABLE_VIEW_CELL"; const float LongTouchableTableViewCell::LONG_TOUCH_INTERVAL = 0.2f; LongTouchableTableViewCell::LongTouchableTableViewCell(): TouchableTableViewCell(),isTouchHold_(false),isLongTouched_(false),longTouchedCallback_(nullptr) {} LongTouchableTableViewCell::~LongTouchableTableViewCell() {} bool LongTouchableTableViewCell::init() { if (!TouchableTableViewCell::init()) { return false; } return true; } void LongTouchableTableViewCell::initTouchListener() { auto touchListener = EventListenerTouchOneByOne::create(); CC_SAFE_RETAIN(touchListener); Rect validTouchedRect; validTouchedRect.size = touchableNode_->getContentSize(); touchListener->onTouchBegan = [=] (cocos2d::Touch* touch,cocos2d::Event* event) { if (touchableNode_ == nullptr) { return false; } auto touchLocation = touch->getLocation(); auto localLocation = touchableNode_->convertToNodeSpace(touchLocation); if (validTouchedRect.containsPoint(localLocation)) { isValidTouched_ = true; isTouchHold_ = true; isLongTouched_ = false; Director::getInstance()->getScheduler()->schedule([=](float) { if (isTouchHold_) { isLongTouched_ = true; if (longTouchedCallback_ != nullptr) { longTouchedCallback_(); } } Director::getInstance()->getScheduler()->unschedule(SCHEDULE_KEY,this); },this,LONG_TOUCH_INTERVAL,0.0f,false,SCHEDULE_KEY); return true; } else { isValidTouched_ = false; isTouchHold_ = false; isLongTouched_ = false; return false; } }; touchListener->onTouchMoved = [=] (cocos2d::Touch* touch,cocos2d::Event* event) { isTouchHold_ = false; isLongTouched_ = false; auto touchLocation = touch->getLocation(); auto localLocation = touchableNode_->convertToNodeSpace(touchLocation); if (validTouchedRect.containsPoint(localLocation)) { isValidTouched_ = true; } else { isValidTouched_ = false; } }; touchListener->onTouchEnded = [=] (cocos2d::Touch* touch,cocos2d::Event* event) { isTouchHold_ = false; auto touchLocation = touch->getLocation(); auto localLocation = touchableNode_->convertToNodeSpace(touchLocation); if (validTouchedRect.containsPoint(localLocation)) { isValidTouched_ = true; } else { isValidTouched_ = false; } }; touchListener->onTouchCancelled = touchListener->onTouchEnded; _eventDispatcher->addEventListenerWithSceneGraphPriority(touchListener,this); } 完整代码详见: (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |