CCScrollView

#ifndef TestCCScrollView_testScene_h
#define TestCCScrollView_testScene_h

#include "cocos2d.h"
#include "cocos-ext.h"
using namespace cocos2d;

class testScene:public CCLayer,public extension::CCScrollViewDelegate
{
    extension::CCScrollView *scrollView;
public:
    virtual void scrollViewDidScroll(cocos2d::extension::CCScrollView* view);
    virtual void scrollViewDidZoom(cocos2d::extension::CCScrollView* view);
public:
    virtual bool init();
    CREATE_FUNC(testScene);
    static CCScene* scene();
    
    //virtual void registerWithTouchDispatcher();
    virtual bool ccTouchBegan(CCTouch *pTouch,CCEvent *pEvent);
    virtual void ccTouchEnded(CCTouch *pTouch,CCEvent *pEvent);
    virtual void ccTouchCancelled(CCTouch *pTouch,CCEvent *pEvent);
    virtual void adjustScrollView();
    virtual void onEnter();
};


#endif
//
//  testScene.cpp
//  TestCCScrollView
//
//  Created by  on 12-2-16.
//  Copyright (c) 2012年 __MyCompanyName__. All rights reserved.
//

#include <iostream>
#include "testScene.h"
using namespace cocos2d::extension;

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

bool testScene::init()
{
    if(!CCLayer::init())
    {
        return false;
    }
    
    scrollView = CCScrollView::create();
    CCLayer *continerLayer = CCLayer::create();
    
    CCSprite *sprite1 = CCSprite::create("Animal_Hd_01.png");
    sprite1->setPosition(ccp(512+0*1024,300));
    continerLayer->addChild(sprite1);
    
    CCSprite *sprite2 = CCSprite::create("Animal_Hd_02.png");
    sprite2->setPosition(ccp(512+1*1024,300));
    continerLayer->addChild(sprite2);
    continerLayer->setAnchorPoint(CCPointZero);
    continerLayer->setPosition(CCPointZero);
    
    scrollView->setAnchorPoint(CCPointZero);
    scrollView->setPosition(CCPointZero);
    
    //显示的区域
    scrollView->setViewSize(CCSizeMake(1024, 600));
    scrollView->setContentOffset(CCPointZero);
    continerLayer->setContentSize(CCSizeMake(5000, 600));
    
    //显示滑动的区域大小 scrollview的实际大小
    
    scrollView->setContentSize(CCSizeMake(5000, 600));
    scrollView->setContainer(continerLayer);
    
    
    //因为要自己实现触摸消息,所以这里设为false ,设置需要滚动的内容
    scrollView->setTouchEnabled(true);
    scrollView->setDirection(kCCScrollViewDirectionHorizontal);
    scrollView->setDelegate(this);
    this->addChild(scrollView);
    
    //ok,这样的话我们就创建完ScrollView了,但是要想做到好一点的效果还是要做一些其他处理。这里主要是设置滑动之后自动让ScrollView自动调整大小
    
    this->setTouchEnabled(true);
    return true;
}
void testScene::scrollViewDidScroll(cocos2d::extension::CCScrollView *view)
{
    return;
}
void testScene::scrollViewDidZoom(cocos2d::extension::CCScrollView *view)
{
    return;
}
void testScene::adjustScrollView()
{
    // 关闭CCScrollView中的自调整
    
    scrollView->unscheduleAllSelectors();
    
    int x = scrollView->getContentOffset().x;
    
    //CCLOG("offset=%d",x);
    
    int offset = (int) x % 1024;
    
    // 调整位置
    
    CCPoint adjustPos;
    
    // 调整动画时间
    
    float adjustAnimDelay;
    
    //   向右滑动是正向左滑动是负
    
    if (offset < -512) {
        
        // 计算下一页位置,时间
        
        adjustPos = ccpSub(scrollView->getContentOffset(), ccp(1024 + offset, 0));
        
        adjustAnimDelay = (float) (1024 + offset) / 800;
        
    }
    
    else {
        
        // 计算当前页位置,时间
        
        adjustPos = ccpSub(scrollView->getContentOffset(), ccp(offset, 0));
        
        // 这里要取绝对值,否则在第一页往左翻动的时,保证adjustAnimDelay为正数
        
        adjustAnimDelay = (float) abs(offset) / 800;
        
    }
    
    
    
    // 调整位置
    
    scrollView->setContentOffsetInDuration(adjustPos, adjustAnimDelay);
    

}

void testScene::onEnter()
{
    CCLayer::onEnter();
    // 这里的第三个参数一定要设置成false,
    // true 即HelloWorld层吞噬掉触摸事件
    // false 即HelloWorld层与CCScrollView对象先后处理触摸事件
    CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 1, false);
}

//void testScene::registerWithTouchDispatcher()
//{
////     如果需要校对这一步,HelloWorld层是需要实现触摸方法的,而触摸的优先级一定要大于CCScrollView对象(也就是说要CCScrollView对象先响应触摸事件,然后在由HelloWorld层响应),而CCScrollView默认设置的优先级是0,所以HelloWorld需要设置为大于0的值
//    CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 1, true);
//}

bool testScene::ccTouchBegan(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)
{
    return true;
}

void testScene::ccTouchEnded(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)
{
    adjustScrollView();
}

void testScene::ccTouchCancelled(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)
{
    adjustScrollView();
}
/*3.校对
这里会有一个问题,那就是当滑动结束时,经常是在两页之间,也就是图2的情况,这种体验不太好,我简单看了一下CCScrollView的源码,发现并没有相关的设置,想必是作者考虑到无法定义每页的大小尺寸,所以没有提供吧!所以,如果需要,我们要额外加一段校对的代码

所以在HelloWorld这层,继承了触摸事件的响应方法,并在ccTouchEnded()方法中校对

在这里我会根据当前相对于半屏的宽度(240像素)作为判断标准,来决定滑动结束时的所在页
这里需要注意的是必须要先关闭CCScrollView的schedule方法,因为CCScrollView在最左边和最右边做了校对,但是对中间的部分没有做校对!*/
原文地址:https://www.cnblogs.com/worldtraveler/p/3056631.html