cocos2d-x 2.0.4 CCTableView 點擊無響應問題


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);

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM