【3.x】

    (1)去掉 “CC”

    (2)滚动方向

        > CCScrollViewDirection 改为强枚举 ScrollView::Direction

//
HORIZONTAL //只能横向滚动
VERTICAL //只能纵向滚动
BOTH //横向纵向都能滚动,默认方式
//

滚动视图类CCScrollView继承于CCLayer,故它会忽略锚点的设置,其锚点始终为(0,0)。而我们知道CCLayer继承了触控事件CCTouch相关的函数。而CCScrollView也继承了触控函数,并将屏幕触控事件的四个函数ccTouchesBegan、ccTouchesMoved、ccTouchesEnded、ccTouchesCancelled进行了重写并实现了有关触摸移动相关的操作。这也就是为什么滚动视图CCScrollView的屏幕可以进行上下左右滚动的原因了。

值得注意的是:既然CCScrollView也是一个CCLayer图层,我们都知道触控滚动的不是CCLayer图层,而是添加在图层上的那些对象。比如CCSprite精灵、以及图层上的CCLayer等等。为了方便实现CCScrollView的滚动效果,cocos2dx引擎规定在使用CCScrollView时,需要在它的上面添加一个用于触控滚动的容器Container,一般容器都选用CCLayer类或其扩展类(如CCLayerColor等)。而触控事件的四个函数也是针对容器Container进行操作的。

也就是说CCScrollView实现的视图滚动,在真正意义上说是对容器Container进行滚动。

1、引入头文件和命名空间

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

2、创建方式

说明:有两种创建方式。对于默认的创建方式create(),会自动创建CCLayer作为滚动视图的容器,且滚动视图的可视区域的大小默认为200*200。而第二种则是可以自定义选择哪个CCLayer作为容器。

值得注意的是:创建滚动视图之后,对于添加子节点操作scrollView->addChild(sp),实际上是将sp添加到容器container中。

//
class CCScrollView : public CCLayer /**
* 2种创建方式
*/ //会自动创建CCLayer作为容器
static CCScrollView* create(); //size: 滚动视图的可视区域大小
//container:自定义滚动视图的CCLayer容器
static CCScrollView* create(CCSize size, CCNode* container = NULL); //举例
CCLayer* scrollLayer = CCLayer::create();
CCScrollView* scrollView = CCScrollView::create(CCSizeMake(150, 100), scrollLayer);
//

3、常用操作

设置容器、尺寸大小、容器的偏移量、允许滚动的方向、放缩、以及其他属性的判断。

注意:因为容器与滚动视图的锚点均为(0,0)。所以容器的偏移量,指容器左下角坐标相对滚动视图左下角坐标的偏移。

//
/**
* 容器相关操作
* setContainer , setContentSize , setContentOffset
*/
//设置滚动视图的容器
void setContainer(CCNode* pContainer);
CCNode* getContainer(); //设置容器Container的尺寸大小
virtual void setContentSize(const CCSize & size);
virtual const CCSize& getContentSize() const; //设置容器相对滚动视图的偏移量
//animated为是否附带滑动的动作效果,还是直接设置为新的偏移量
//默认滑动动作为0.15秒,从旧位置滑动到新位置.
void setContentOffset(CCPoint offset, bool animated = false);
void setContentOffsetInDuration(CCPoint offset, float dt);
CCPoint getContentOffset(); /**
* 滚动视图相关操作
* setViewSize , setDirection , setZoomScale ,
* isDragging , isTouchMoved , setBounceable , setTouchEnabled
*/
//设置滚动视图可视区域的大小
void setViewSize(CCSize size);
CCSize getViewSize(); //设置滚动视图允许滚动的方向
//CCScrollViewDirection:
// kCCScrollViewDirectionBoth 横向纵向都能滚动,默认方式
// kCCScrollViewDirectionHorizontal 只能横向滚动
// kCCScrollViewDirectionVertical 只能纵向滚动
virtual void setDirection(CCScrollViewDirection eDirection);
CCScrollViewDirection getDirection(); //放缩滚动视图大小
//好像有bug,建议不要使用了!
void setZoomScale(float s);
void setZoomScale(float s, bool animated);
float getZoomScale();
void setZoomScaleInDuration(float s, float dt); bool isDragging(); //用户是否正在CCScrollView中操作
bool isTouchMoved(); //用户是否在CCScrollView中移动
void setBounceable(bool bBounceable); //是否开启弹性效果
bool isBounceable(); //是否具有弹性效果
void setTouchEnabled(bool e); //是否开启触摸
//

4、事件委托代理接口类CCScrollViewDelegate

CCScrollViewDelegate类主要是用来侦听CCScrollView的事件,并设置事件的回调响应函数。

使用方法:在创建CCScrollView类的CCLayer类中,让CCLayer继承CCScrollViewDelegate,并重写如下两个事件回调响应函数。

//
virual void scrollViewDidScroll(CCScrollView * view); //有滚动时的响应函数
virual void scrollViewDidZoom(CCScrollView * view); //有缩放时的响应函数
//

5、委托代理

//
//设置滚动视图的事件委托代理对象,一般为this
//并且CCLayer必需要继承代理接口类CCScrollViewDelegate
void setDelegate(CCScrollViewDelegate* pDelegate);
CCScrollViewDelegate* getDelegate(); //举例:
//scrollView->setDelegate(this);
//

6、关于尺寸大小

CCScrollView的使用过程中涉及到两个尺寸大小。

(1)滚动视图的尺寸大小:即可视区域的大小。使用setViewSize()进行设置。

(2)容器的尺寸大小:使用setContentSize()进行设置。

例如设置滚动视图尺寸大小为100*100,容器的尺寸大小为1000*1000。那么每次对视图进行滚动,都只能看到容器100*100的某部分区域。

7、关于触摸滚动

使用setDirection()可以设置滚动的方向。主要有三个类型:

(1)横向纵向都能滚动    kCCScrollViewDirectionBoth

(2)只能横向滚动        kCCScrollViewDirectionHorizontal

(3)只能纵向滚动        kCCScrollViewDirectionVertical

另外setTouchEnabled()是用来设置是否开启触控事件的。所以若设置为false。那么即使setDirection()了,也无法滚动视图。

8、使用技巧

(1)创建CCScrollView,和容器CCLayer;并设置滚动视图的容器为该容器。

(2)设置容器的尺寸大小setContentSize;滚动视图(可视区域)的尺寸大小setViewSize。

(3)将各种精灵、菜单、按钮等加入到容器中。

(4)设置委托代理setDelegate(this),并实现回调函数。


【代码实战】

这里例举了滚动视图CCScrollView的三种用途。

1、资源图片

第一组:

第二组:

第三组:

2、引入头文件和命名空间

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

3、继承CCScrollViewDelegate,重写事件侦听函数

//
class HelloWorld : public cocos2d::CCLayer,public CCScrollViewDelegate
{
public:
virtual bool init();
static cocos2d::CCScene* scene();
void menuCloseCallback(CCObject* pSender);
CREATE_FUNC(HelloWorld); void test1(); //测试图片滚动
void test2(); //测试只能纵向滚动
void test3(); //测试背包翻页 int pageNumber; //背包第几页
CCMenuItemImage* pBack; //往前翻页
CCMenuItemImage* pFront; //往后翻页
void scrollImage(CCObject* sender); //test3的背包翻页 void scrollViewDidScroll(CCScrollView* view); //滚动时响应的回调函数
void scrollViewDidZoom(CCScrollView* view); //放缩时响应的回调函数
};
//

4、委托代理回调函数

在控制台输出LOG。

//
void HelloWorld::scrollViewDidScroll(CCScrollView* view)
{
CCLOG("ScrollView Moved!");
}
void HelloWorld::scrollViewDidZoom(CCScrollView* view)
{
CCLOG("ScrollView Scaled");
}
//

5、测试图片滚动test1()

屏幕大小:480*320。滚动视图大小:480*320。容器大小:960*600。

开启弹性效果setBounceable。

//
void HelloWorld::test1()
{
CCSize visableSize = CCSizeMake(480, 320); //屏幕大小
CCSize mysize = CCSizeMake(960,600); //容器大小 //创建容器、设置大小
CCLayerColor* scrollLayer = CCLayerColor::create( ccc4(255,255,255,255) );
scrollLayer->setContentSize(mysize); //容器中的东西
CCSprite* bg = CCSprite::create("war.png");
bg->setPosition( ccp(960/2.0, 600/2.0) );
scrollLayer->addChild(bg); //创建滚动视图CCScrollView
CCScrollView* scrollView = CCScrollView::create();
this->addChild(scrollView, 0, 1); //属性设置
scrollView->setContainer(scrollLayer); //设置容器
scrollView->setViewSize( visableSize ); //可视区域大小
scrollView->setBounceable(true); //是否具有弹性 //委托代理
scrollView->setDelegate(this);
}
//

6、测试只能纵向滚动test2()

屏幕大小:480*320。滚动视图大小:150*100。容器大小:150*220。

将滚动视图设置到屏幕中心位置,并设置滚动方向setDirection,只能纵向滚动。

//
void HelloWorld::test2()
{
CCSize visableSize = CCSizeMake(480, 320); //屏幕大小
CCSize mysize = CCSizeMake(150,220); //容器大小 //创建容器、设置大小
CCLayerColor* scrollLayer = CCLayerColor::create( ccc4(255,255,255,255) );
scrollLayer->setContentSize(mysize); //容器中添加四个按钮
for(int i = 1; i <= 4; i++)
{
char file[20];
sprintf(file, "btn%d.png", i);
CCSprite* btn = CCSprite::create(file);
btn->setPosition( ccp(mysize.width/2, 220 - 50*i) );
scrollLayer->addChild(btn);
} //创建滚动视图CCScrollView
//可视区域大小150*100 、 容器为scrollLayer
CCScrollView* scrollView = CCScrollView::create(CCSizeMake(150, 100), scrollLayer);
scrollView->setPosition( visableSize/2 - ccp(150/2.0, 100/2.0) );
this->addChild(scrollView, 0, 2); //设置为只能纵向滚动
scrollView->setDirection(kCCScrollViewDirectionVertical); //委托代理
scrollView->setDelegate(this);
}
//

7、测试背包翻页test3()

屏幕大小:480*320。滚动视图大小:100*80。容器大小:300*80。

关闭触控事件setTouchEnabled(false),创建两个按钮,实现只能通过按钮进行左右翻页。

翻页原理:通过设置容器的偏移值setContentOffset。

//
void HelloWorld::test3()
{
CCSize visableSize = CCSizeMake(480, 320); //屏幕大小
CCSize mysize = CCSizeMake(300,80); //容器大小 //创建容器、设置大小
CCLayerColor* scrollLayer = CCLayerColor::create( ccc4(255,255,255,255) );
scrollLayer->setContentSize(mysize); //容器中添加三个图片
for(int i = 1; i <= 3; i++)
{
char file[20];
sprintf(file, "sp%d.png", i);
CCSprite* sp = CCSprite::create(file);
sp->setPosition( ccp(100*i - 50, 40) );
scrollLayer->addChild(sp);
} //创建滚动视图CCScrollView
//可视区域大小100*80 、 容器为scrollLayer
CCScrollView* scrollView = CCScrollView::create(CCSizeMake(100, 80), scrollLayer);
scrollView->setPosition( visableSize/2 - ccp(100/2.0, 0) );
this->addChild(scrollView, 0, 3); //属性设置
scrollView->setTouchEnabled(false); //关闭触碰事件,无法触摸滚动 //委托代理
scrollView->setDelegate(this); //创建背包翻页按钮
//前翻pBack、后翻pFront
pBack = CCMenuItemImage::create("b1.png", "b2.png", "b3.png", this, menu_selector(HelloWorld::scrollImage) );
pFront = CCMenuItemImage::create("f1.png", "f2.png", "f3.png", this, menu_selector(HelloWorld::scrollImage) );
pBack->setPosition( ccp(visableSize.width/2 - 100, 60) );
pFront->setPosition( ccp(visableSize.width/2 + 100, 60) );
CCMenu* pMenu = CCMenu::create(pBack, pFront, NULL);
pMenu->setPosition(CCPointZero);
this->addChild(pMenu, 0, 100); pBack->setEnabled(false);
pageNumber = 0; //第0页 } //实现翻页效果scrollImage
void HelloWorld::scrollImage(CCObject* sender)
{
CCScrollView* scrollView = (CCScrollView*)this->getChildByTag(3); if(sender == pBack && pBack->isEnabled() )
{
pageNumber = max(0, pageNumber-1); //前翻
}
else if( pFront->isEnabled() )
{
pageNumber = min(2, pageNumber+1); //后翻
} //设置容器相对滚动视图的偏移量
scrollView->setContentOffset(ccp(-100 * pageNumber, 0), true); pBack->setEnabled( pageNumber != 0);
pFront->setEnabled( pageNumber != 2);
}
//

8、运行结果

8.1、背景滚动、附带弹性效果

8.2、只能纵向滚动,附带弹性效果

8.3、背包翻页、无法触摸滚动、通过按钮进行翻页

cocos2dx基础篇(14) 滚动视图CCScrollView的更多相关文章

  1. cocos2dx基础篇(15) 列表视图CCTableView

    [3.x] (1)去掉 "CC" (2)TableViewCell 中: > unsigned int getIdx() 返回类型改为 ssize_t(类型为 long) ( ...

  2. cocos2dx基础篇(3) 常用重要类

    ---------------------------------------- 入口类main.cpp 主要控制类AppDelegate.cpp -------------------------- ...

  3. iOS系列 基础篇 04 探究视图生命周期

    iOS系列 基础篇 04 探究视图生命周期 视图是应用的一个重要的组成部份,功能的实现与其息息相关,而视图控制器控制着视图,其重要性在整个应用中不言而喻. 以视图的四种状态为基础,我们来系统了解一下视 ...

  4. Cocos2d-x学习笔记(14)(更新函数scheduleUpdate、进度计时器CCProgressTo、滚动视图CCScrollView)

    一.scheduleUpdate 1.scheduleUpdate:此函数是CCNode的函数,每一个CCNode仅仅要调用scheduleUpdate更新函数,那么这个CCNode就会响应当前类的u ...

  5. cocos2dx基础篇(17) 音乐音效SimpleAudioEngine

    [3.x]     (1)获取单例:sharedEngine() 改为 getInstance()     (2)实现了:音量的调节.     (3)修改了播放音效 playEffect() 的参数: ...

  6. Cocos2d-X 使用CCTableView创建滚动视图

    CCTableView和CCScrollView如创建滚动视图,CCTableView该函数将是更,制造更多麻烦 实例1:使用CCTableView创建滚动视图 首先创建一个TableView类 Ta ...

  7. cocos2dx基础篇(22) 基本动画CCAnimation/CCAnimate

    [小知识] CCSpriteFrame     :精灵帧.    它是相对动画而产生的,其实就是一张纹理图片. CCAnimationFrame  :动画帧.    由精灵帧与间隔帧数组成,是动画CC ...

  8. 【Cocos2d入门教程二】Cocos2d-x基础篇

    上一章已经学习了环境的搭建.这一章对基础概念进行掌握.内容大概有: 1.导演 2.场景 3.节点 4.层 4.精灵 1.导演(Director) 导演存在的主要作用: a.环境设定(帧率 初始化ope ...

  9. cocos2dx基础篇(23) 粒子系统CCParticleSystem

    [3.x]     (1)去掉"CC"     (2)粒子位置模式 tPositionType 改为强枚举类型 ParticleSystem::PositionType:: // ...

随机推荐

  1. jenkins 构建时显示git分支插件、显示构建分支插件

    参数化构建分支 1.安装插件:Git Parameter 2.找到我们在Jenkins中建立的工程,勾选“参数化构建过程”,并如下配置 3.在“源码管理”中如下配置 Jenkins构建完显示构建用户和 ...

  2. 告别if/else连环写法

    1.once Upon a time 在平时的编码过程中,我们大部分新手可能都特别钟情于 if/else连环写法,比如举个简单栗子: 拿订单来说,我们正常的订单类型有多种,那么对应就会生成不同的收款, ...

  3. win7抓带tag标记报文

    1. 本地连接 ,右键→属性→高级→属性里选择“优先级和 VLAN” ,看右 边的 “值” 是不是已经启用,  没有启用的话就启用它. (如果没有这个选项, 那你可能要把网卡驱动升个高版本的了. ) ...

  4. 流式布局和viewport

    流式布局 百分比布局,非固定宽度,内容向两边填充,流动的布局. viewport(视口) PC端的网页在手机端的浏览器显示是不会出现网页的,这是因为移动端的网页不是直接放在移动端的浏览器中,而是放在移 ...

  5. bio,nio,aio的区别 select,poll,epoll的区别

    先了解一些基本概念,什么是socket?什么是I/O操作 unix(like)世界里,一切皆文件,而文件是什么呢?文件就是一串二进制流而已,不管socket,还是FIFO.管道.终端,对我们来说,一切 ...

  6. Charles在windows上抓取本地python的 request请求

    首先打开charles,在Proxy中打开Windows Proxy,这样才能抓取本地请求 python代码中报错Caused by SSLError(SSLError(1, '[SSL: CERTI ...

  7. 【NOIP2016提高A组集训第1场10.29】完美标号

    题目 给定M个二元组(A_i, B_i),求X_1, ..., X_N满足:对于任意(A_i, B_i),有|X_{A_i} - X_{B_i}| = 1成立. 分析 显然,对于二元组(x,y),X_ ...

  8. Comet OJ - Contest #12 D

    题目描述 求(x,y)的对数满足x∈[0,a],y∈[0,b],x⊕y=0且|x-y|<=m 题解 一种比较sb的做法是考虑x-y的借位,根据借位以及差值进行转移 还有一种比较正常的做法,假设一 ...

  9. python1--比较三个数值的大小

    num1 = input("num1:")num2 = input("num2:")num3 = input("num3:")num = m ...

  10. druid配置以及监控

    1.druid监控的功能: . 数据源 . SQL监控 对执行的MySQL语句进行记录,并记录执行时间.事务次数等 . SQL防火墙 对SQL进行预编译,并统计该条SQL的数据指标 . Web应用 对 ...