cocos2d-x 2.0.4 版本中,CCTableView點擊某個cell時,很多情況下都沒有響應,這個時候往往列表會移動一下。
看了下CCTableView的源碼,是由於判斷存在移動則不觸發點擊事件導致的,因為有的手機屏幕比較敏感,隨便按一下都會出現幾個移動事件,導致誤判的,解決思路:
1.自己寫一個類繼承CCTableView類
2.增加ccTouchBegan()事件處理,記錄點擊的位置和時間,精確到毫秒.
3.增加ccTouchMove()事件處理, 記錄當前位置
4.繼承ccTouchEnd事件,去掉原來的判斷中的isTouchMove()判斷,增加自己的判斷邏輯:
如果時間很短(<150ms),而且移動距離很短(<ccp(10,10)), 則認為沒有移動,否則認為有移動。
附上我的源代碼:
MyTableView.h:
#ifndef __MYTABLEVIEW_H__ #define __MYTABLEVIEW_H__ #include "cocos2d.h" #include "cocos-ext.h" #include <stdio.h> #include <sys/time.h> #include <time.h> USING_NS_CC; USING_NS_CC_EXT; class MyTableView : public CCTableView { public: bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent); void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent); void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent); static MyTableView* create(CCTableViewDataSource* dataSource, CCSize size); static MyTableView* create(CCTableViewDataSource* dataSource, CCSize size, CCNode *container); protected: CCPoint m_beginPoint; CCPoint m_lastPoint; struct timeval m_beginTime; struct timeval m_endTime; }; #endif
MyTableView.cpp:
#include "MyTableView.h" #include <stdlib.h> MyTableView* MyTableView::create(CCTableViewDataSource* dataSource, CCSize size) { return MyTableView::create(dataSource, size, NULL); } MyTableView* MyTableView::create(CCTableViewDataSource* dataSource, CCSize size, CCNode *container) { MyTableView *table = new MyTableView(); table->initWithViewSize(size, container); table->autorelease(); table->setDataSource(dataSource); table->_updateContentSize(); return table; } bool MyTableView::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent) { m_beginPoint = pTouch->getLocation(); ::gettimeofday(&m_beginTime, NULL); CCLog("touch begin"); return CCTableView::ccTouchBegan(pTouch, pEvent); } void MyTableView::ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent) { m_lastPoint = pTouch->getLocation(); CCTableView::ccTouchMoved(pTouch, pEvent); } void MyTableView::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent) { CCLog("touch end"); ::gettimeofday(&m_endTime, NULL); if (!this->isVisible()) { return; } /// 判斷是否有移動 bool isTouchMove = true; float moveRange = 10; // 移動范圍小於10個像素 CCLog("bt:%d,%d", m_beginTime.tv_sec, m_beginTime.tv_usec); CCLog("et:%d,%d", m_endTime.tv_sec, m_endTime.tv_usec); long timediff = m_endTime.tv_sec - m_beginTime.tv_sec; timediff = timediff* 1000 + (m_endTime.tv_usec - m_beginTime.tv_usec)/1000; CCLog("timediff:%ld", timediff); // 觸屏時間少於150ms if (timediff < 150) { float dx = m_beginPoint.x - m_lastPoint.x; float dy = m_beginPoint.y - m_lastPoint.y; CCLog("bp:%f,%f", m_beginPoint.x, m_beginPoint.y); CCLog("ep:%f,%f, %f, %f", m_lastPoint.x, m_lastPoint.y, dx, dy); if ((-moveRange < dx && dx < moveRange) && (-moveRange < dy && dy < moveRange)) { isTouchMove = false; } } if (m_pTouches->count() == 1 && !isTouchMove) { CCLog("CCTableView::ccTouchEnded not move"); unsigned int index; CCTableViewCell *cell; CCPoint point; point = this->getContainer()->convertTouchToNodeSpace(pTouch); if (m_eVordering == kCCTableViewFillTopDown) { CCSize cellSize = m_pDataSource->cellSizeForTable(this); point.y -= cellSize.height; } index = this->_indexFromOffset(point); cell = this->_cellWithIndex(index); if (cell) { m_pTableViewDelegate->tableCellTouched(this, cell); } } CCScrollView::ccTouchEnded(pTouch, pEvent); }
