cocos2d-x支持长按的TableViewCell

前端之家收集整理的这篇文章主要介绍了cocos2d-x支持长按的TableViewCell前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

原文请猛戳:
http://galoisplusplus.coding.me/blog/2014/11/18/touchable-tableviewcell-in-cocos2d-x/

再次来聊一聊cocos2d-x的TableView。之前之所以用继承TableView的方式实现2D的GridView是因为用到TableView点击事件的地方涉及到全局数据的复杂处理,这块处理放到TableViewDelegate类的tableCellTouched比较合理。但这个函数在cell被点击时都会被调用,而实际游戏里一个cell往往只有部分UI才能被点击(所以当点击事件只与这个cell的数据相关时,直接把点击事件处理放到cell内部实现才是王道),故而我们需要对cell的点击区域做进一步的限制。为此,我封装了一个TableViewCell的子类来实现这一功能

  1. TouchableTableViewCell::TouchableTableViewCell():
  2. isValidTouched_(false),touchableNode_(nullptr)
  3. {}
  4.  
  5. TouchableTableViewCell::~TouchableTableViewCell()
  6. {}
  7.  
  8. bool TouchableTableViewCell::init()
  9. {
  10. if (!TableViewCell::init()) {
  11. return false;
  12. }
  13. return true;
  14. }
  15.  
  16. void TouchableTableViewCell::initTouchListener()
  17. {
  18. auto touchListener = EventListenerTouchOneByOne::create();
  19. CC_SAFE_RETAIN(touchListener);
  20. Rect validTouchedRect;
  21. validTouchedRect.size = touchableNode_->getContentSize();
  22. touchListener->onTouchBegan = [=] (cocos2d::Touch* touch,cocos2d::Event* event) {
  23. if (touchableNode_ == nullptr) {
  24. return false;
  25. }
  26. auto touchLocation = touch->getLocation();
  27. auto localLocation = touchableNode_->convertToNodeSpace(touchLocation);
  28. if (validTouchedRect.containsPoint(localLocation)) {
  29. isValidTouched_ = true;
  30. return true;
  31. } else {
  32. isValidTouched_ = false;
  33. return false;
  34. }
  35. };
  36. touchListener->onTouchMoved = [=] (cocos2d::Touch* touch,cocos2d::Event* event) {
  37. auto touchLocation = touch->getLocation();
  38. auto localLocation = touchableNode_->convertToNodeSpace(touchLocation);
  39. if (validTouchedRect.containsPoint(localLocation)) {
  40. isValidTouched_ = true;
  41. } else {
  42. isValidTouched_ = false;
  43. }
  44. };
  45. touchListener->onTouchEnded = touchListener->onTouchMoved;
  46. touchListener->onTouchCancelled = touchListener->onTouchEnded;
  47. _eventDispatcher->addEventListenerWithSceneGraPHPriority(touchListener,this);
  48. }
  49.  
  50. void TouchableTableViewCell::setTouchableNode(cocos2d::Node* touchableNode)
  51. {
  52. touchableNode_ = touchableNode;
  53. initTouchListener();
  54. }

使用时只需让实际的TableViewCell类继承TouchableTableViewCell,在tableCellTouched函数中判断isValidTouched_即可。

另外,有时候我们需要让TableViewCell响应长按事件,我在之前的TouchableTableViewCell类上又做了一层封装,主要使用调度器来实现长按:

  1. const std::string LongTouchableTableViewCell::SCHEDULE_KEY = "LONG_TOUCHABLE_TABLE_VIEW_CELL";
  2. const float LongTouchableTableViewCell::LONG_TOUCH_INTERVAL = 0.2f;
  3.  
  4. LongTouchableTableViewCell::LongTouchableTableViewCell():
  5. TouchableTableViewCell(),isTouchHold_(false),isLongTouched_(false),longTouchedCallback_(nullptr)
  6. {}
  7.  
  8. LongTouchableTableViewCell::~LongTouchableTableViewCell()
  9. {}
  10.  
  11. bool LongTouchableTableViewCell::init()
  12. {
  13. if (!TouchableTableViewCell::init()) {
  14. return false;
  15. }
  16. return true;
  17. }
  18.  
  19. void LongTouchableTableViewCell::initTouchListener()
  20. {
  21. auto touchListener = EventListenerTouchOneByOne::create();
  22. CC_SAFE_RETAIN(touchListener);
  23. Rect validTouchedRect;
  24. validTouchedRect.size = touchableNode_->getContentSize();
  25. touchListener->onTouchBegan = [=] (cocos2d::Touch* touch,cocos2d::Event* event) {
  26. if (touchableNode_ == nullptr) {
  27. return false;
  28. }
  29. auto touchLocation = touch->getLocation();
  30. auto localLocation = touchableNode_->convertToNodeSpace(touchLocation);
  31. if (validTouchedRect.containsPoint(localLocation)) {
  32. isValidTouched_ = true;
  33. isTouchHold_ = true;
  34. isLongTouched_ = false;
  35. Director::getInstance()->getScheduler()->schedule([=](float) {
  36. if (isTouchHold_) {
  37. isLongTouched_ = true;
  38. if (longTouchedCallback_ != nullptr) {
  39. longTouchedCallback_();
  40. }
  41. }
  42. Director::getInstance()->getScheduler()->unschedule(SCHEDULE_KEY,this);
  43. },this,LONG_TOUCH_INTERVAL,0.0f,false,SCHEDULE_KEY);
  44.  
  45. return true;
  46. } else {
  47. isValidTouched_ = false;
  48. isTouchHold_ = false;
  49. isLongTouched_ = false;
  50.  
  51. return false;
  52. }
  53. };
  54. touchListener->onTouchMoved = [=] (cocos2d::Touch* touch,cocos2d::Event* event) {
  55. isTouchHold_ = false;
  56. isLongTouched_ = false;
  57.  
  58. auto touchLocation = touch->getLocation();
  59. auto localLocation = touchableNode_->convertToNodeSpace(touchLocation);
  60. if (validTouchedRect.containsPoint(localLocation)) {
  61. isValidTouched_ = true;
  62. } else {
  63. isValidTouched_ = false;
  64. }
  65. };
  66. touchListener->onTouchEnded = [=] (cocos2d::Touch* touch,cocos2d::Event* event) {
  67. isTouchHold_ = false;
  68.  
  69. auto touchLocation = touch->getLocation();
  70. auto localLocation = touchableNode_->convertToNodeSpace(touchLocation);
  71. if (validTouchedRect.containsPoint(localLocation)) {
  72. isValidTouched_ = true;
  73. } else {
  74. isValidTouched_ = false;
  75. }
  76. };
  77. touchListener->onTouchCancelled = touchListener->onTouchEnded;
  78. _eventDispatcher->addEventListenerWithSceneGraPHPriority(touchListener,this);
  79. }

完整代码详见:
cocos2d-x-TouchableTableViewCell

猜你在找的Cocos2d-x相关文章