#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在最左边和最右边做了校对,但是对中间的部分没有做校对!*/