加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ScrollView与TableView实现选择效果

发布时间:2020-12-14 16:56:11 所属栏目:百科 来源:网络整理
导读:在cocos2dx中,ScrollView与TableView都可以实现选择效果,其中ScrollView较为原始,TableView的格子大小可以不与winSize一样大。 ScrollView实现 #include "T25ScrollView.h" #include "AppMacros.h" CCScene* T25ScrollView::scene(){ CCScene *scene =CCS

在cocos2dx中,ScrollView与TableView都可以实现选择效果,其中ScrollView较为原始,TableView的格子大小可以不与winSize一样大。

ScrollView实现

#include "T25ScrollView.h"
#include "AppMacros.h"

CCScene* T25ScrollView::scene()
{
    CCScene *scene=CCScene::create();
    T25ScrollView* layer=T25ScrollView::create();
    scene->addChild(layer);
    return scene;
}

bool T25ScrollView::init()
{
    CCLayer::init();
    CCNode *node=CCNode::create();
    _node=node;
    char buf[]="a";
    for (int i=0;i<5;i++)
    {
        CCSprite *s=CCSprite::create("HelloWorld.png");
        node->addChild(s);
        s->setPosition(ccp(i*winSize.width,0));
        s->setAnchorPoint(ccp(0,0));



        CCLabelTTF *label=CCLabelTTF::create(buf,"Arial",24);
        buf[0]++;
        s->addChild(label);
        label->setPosition(ccp(winSize.width/2,winSize.height/2));

    }
    CCScrollView *view=CCScrollView::create(winSize,node);
    addChild(view);
    view->setDirection(kCCScrollViewDirectionHorizontal);
    view->setContentSize(CCSizeMake(winSize.width*5,winSize.height));
    view->setBounceable(false); //get rid of elastic

    setTouchEnabled(true);
    setTouchMode(kCCTouchesOneByOne);
    return true;
}

bool T25ScrollView::ccTouchBegan(CCTouch *pTouch,CCEvent *pEvent)
{

    return true;
}
void T25ScrollView::adjustViewPosition(float dt)
{
    //calculate 
    int fitPos[]={0,-winSize.width,-winSize.width*2,-winSize.width*3,-winSize.width*4};
    int x=_node->getPositionX();
    int i;
    for(i=0;i<5;i++)
    {
        int dist=abs(fitPos[i]-x);
        if (dist<winSize.width/2)
        {
            break;
        }
    }

    CCPoint ptDest=ccp(fitPos[i],0);
    _node->runAction(CCMoveTo::create(0.2f,ptDest));
}
void T25ScrollView::ccTouchEnded(CCTouch *pTouch,CCEvent *pEvent)
{
    //judge if is slider
    if (isSlider(pTouch))
    {
        //adjust position 
        scheduleOnce(schedule_selector(T25ScrollView::adjustViewPosition),0.05f);
        return;
    }
    //judge which position is clicked
    CCPoint ptWorld=pTouch->getLocation();
    CCPoint ptNode=_node->convertToNodeSpace(ptWorld);
    int index=ptNode.x/winSize.width;
    CCLog("click index =%d",index);
}

bool T25ScrollView::isSlider(CCTouch *PTouch)
{
    CCPoint ptCur=PTouch->getLocation();
    CCPoint ptStart=PTouch->getStartLocation();
    if (ptCur.getDistanceSq(ptStart)>25)
    {
        return true;

    }

    return false;
}

TableView实现

#include "T26TableView.h"
#include "AppMacros.h"

CCScene* T26TableView::scene()
{
    CCScene *scene=CCScene::create();
    T26TableView* layer=T26TableView::create();
    scene->addChild(layer);
    return scene;
}

bool T26TableView::init()
{
    CCLayer::init();
    CCSize cellSize=CCSize(80,80);
    _cells=CCArray::create();
    _cells->retain();
    for(int i=0;i<5;i++)
    {
        CCTableViewCell *cell=new CCTableViewCell;
        _cells->addObject(cell);
        cell->autorelease();

        CCSprite *sprite=CCSprite::create("p_2_01.png");
        cell->addChild(sprite);
        sprite->setPosition(ccp(cellSize.width/2,cellSize.height/2));

    }
    CCTableView *view=CCTableView::create(this,CCSize(cellSize.width*3,cellSize.height));

    addChild(view);
    view->setDirection(kCCScrollViewDirectionHorizontal);
    view->reloadData();
    view->setPosition(ccp(200,200));
    //response click
    view->setDelegate(this);
    return true;
}

其中在TableView中使用了代理的设计模式,类要继承public CCTableViewDataSource,public CCTableViewDelegate,并且实现他们的纯虚函数,从而达到代理的效果

运行效果

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读