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

來源:互聯網
上載者:User

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

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.