#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(+*,));
continerLayer->addChild(sprite1); CCSprite *sprite2 = CCSprite::create("Animal_Hd_02.png");
sprite2->setPosition(ccp(+*,));
continerLayer->addChild(sprite2);
continerLayer->setAnchorPoint(CCPointZero);
continerLayer->setPosition(CCPointZero); scrollView->setAnchorPoint(CCPointZero);
scrollView->setPosition(CCPointZero); //显示的区域
scrollView->setViewSize(CCSizeMake(, ));
scrollView->setContentOffset(CCPointZero);
continerLayer->setContentSize(CCSizeMake(, )); //显示滑动的区域大小 scrollview的实际大小 scrollView->setContentSize(CCSizeMake(, ));
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 % ; // 调整位置 CCPoint adjustPos; // 调整动画时间 float adjustAnimDelay; // 向右滑动是正向左滑动是负 if (offset < -) { // 计算下一页位置,时间 adjustPos = ccpSub(scrollView->getContentOffset(), ccp( + offset, )); adjustAnimDelay = (float) ( + offset) / ; } else { // 计算当前页位置,时间 adjustPos = ccpSub(scrollView->getContentOffset(), ccp(offset, )); // 这里要取绝对值,否则在第一页往左翻动的时,保证adjustAnimDelay为正数 adjustAnimDelay = (float) abs(offset) / ; } // 调整位置 scrollView->setContentOffsetInDuration(adjustPos, adjustAnimDelay); } void testScene::onEnter()
{
CCLayer::onEnter();
// 这里的第三个参数一定要设置成false,
// true 即HelloWorld层吞噬掉触摸事件
// false 即HelloWorld层与CCScrollView对象先后处理触摸事件
CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, , 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在最左边和最右边做了校对,但是对中间的部分没有做校对!*/

最新文章

  1. Entity Framework 6 Recipes 2nd Edition(9-7)译-&gt;在WCF服务中序列化代理
  2. Linux时间戳和标准时间的互转
  3. 【转】Linux安装方法一(U盘引导)
  4. C:上台阶
  5. C++引用计数
  6. http一问一答
  7. ubuntu 引导删除
  8. jenkins综合cobertura,来电显示cobertura的report
  9. C#排列组合类
  10. [Swift]LeetCode90. 子集 II | Subsets II
  11. forEach() 和 map() 遍历
  12. 基于面向方面和UML的实时系统建模研究
  13. if语句学习
  14. 基础的正则表达式与re模块(2)
  15. vue 父组件中的数据如何传递给子组件
  16. CSS知识点集锦
  17. e794. 创建JSlider组件
  18. CodeForces Round #527 (Div3) A. Uniform String
  19. WinFrom 第三方控件 TeleRik控件
  20. bzoj 1270: [BeijingWc2008]雷涛的小猫 简单dp+滚动数组

热门文章

  1. Bate冲刺四——《WAP团队》
  2. jq的attr()与prop()之间区别
  3. JavaScript算法相关
  4. xhr文件类型说明
  5. jsp post/get中接处理
  6. Vue.js 渲染函数, JSX(未掌握,未学完)
  7. 重构 MVC; 代码分享工具(重构,改进,打分)
  8. Confluence 6 嵌套用户组的备注
  9. PHP函数总结 (五)
  10. linux进程原语之fork()