zoukankan      html  css  js  c++  java
  • 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在最左边和最右边做了校对,但是对中间的部分没有做校对!*/
  • 相关阅读:
    c# 三种取整方法 向上取整 向下取整 四舍五入
    Lambda表达式对DataRow处理
    Dapper数据库字段和model属性映射
    union limit
    北邮五十题
    搜索____深搜 学易错点
    动态规划____有重叠子问题的搜索,都可以转为记忆化搜索
    64位 __int 与 long long写法
    做做 卡特兰数 与 卡米歇尔数
    vector 有点麻烦啊 能简单点么?
  • 原文地址:https://www.cnblogs.com/worldtraveler/p/3056631.html
Copyright © 2011-2022 走看看