cocos2d-x ScrollView(上)

2024-09-05 13:32
文章标签 cocos2d scrollview

本文主要是介绍cocos2d-x ScrollView(上),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

scrollView 的调用问题困扰我很久,昨天才有时间继续研究这个,可惜最后还是没能完全解决它存在的问题。。。


看头文件:

[cpp] view plain copy
  1. #ifndef __HELLOWORLD_SCENE_H__  
  2. #define __HELLOWORLD_SCENE_H__  
  3.   
  4. #include "cocos2d.h"  
  5.   
  6. #include "../../extensions/cocos-ext.h"  
  7.   
  8. //using namespace CocosDenshion;  
  9.   
  10. using namespace cocos2d;  
  11.   
  12. USING_NS_CC;  
  13. USING_NS_CC_EXT;  
  14.   
  15. class HelloWorld : public CCLayer, public CCScrollViewDelegate  
  16. {  
  17. public:  
  18.     // Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone  
  19.     virtual bool init();    
  20.   
  21.     // there's no 'id' in cpp, so we recommand to return the exactly class pointer  
  22.     static cocos2d::CCScene* scene();  
  23.       
  24.     // implement the "static node()" method manually  
  25.     CREATE_FUNC(HelloWorld);  
  26.   
  27.     virtual void scrollViewDidScroll(cocos2d::extension::CCScrollView* view) {};  
  28.     virtual void scrollViewDidZoom(cocos2d::extension::CCScrollView* view) {};  
  29.       
  30. public:  
  31.     virtual void onEnter();  
  32.     virtual void onExit();  
  33.       
  34.     virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);  
  35.     virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);  
  36.     virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);  
  37.     virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent);  
  38.       
  39. private:  
  40.     // 当触摸事件结束时,校正CCScrollView的位置  
  41.     void adjustScrollView();  
  42.       
  43. private:  
  44.     // 菜单回调  
  45.     void menu1Callback(CCObject *pSender);  
  46.     void menu2Callback(CCObject *pSender);  
  47.       
  48. private:    
  49.     CCScrollView *scrollView;  
  50. };  
  51.   
  52. #endif  // __HELLOWORLD_SCENE_H__  

看.cpp
[cpp] view plain copy
  1. #include "HelloWorldScene.h"  
  2.   
  3. // 校正滑动动画速度  
  4. #define ADJUST_ANIM_VELOCITY 800;  
  5.   
  6. CCScene* HelloWorld::scene()  
  7. {  
  8.     CCScene * scene = NULL;  
  9.     do   
  10.     {  
  11.         scene = CCScene::create();  
  12.         CC_BREAK_IF(! scene);  
  13.   
  14.         HelloWorld *layer = HelloWorld::create();  
  15.         CC_BREAK_IF(! layer);  
  16.   
  17.         scene->addChild(layer);  
  18.     } while (0);  
  19.   
  20.     return scene;  
  21. }  
  22.   
  23. bool HelloWorld::init()  
  24. {  
  25.     bool bRet = false;  
  26.     do   
  27.     {  
  28.         <span style="white-space:pre">  </span>CC_BREAK_IF(! CCLayer::init());  
  29.         CCSize size = CCDirector::sharedDirector()->getWinSize();  
  30.   
  31.         //add scrollView and layer  
  32.         scrollView = CCScrollView::create();    
  33.         CCLayer *layer = CCLayer::create();    
  34.   
  35.         //set layer AnchorPoint and Position zero  
  36.         layer->setAnchorPoint(CCPointZero);    
  37.         layer->setPosition(CCPointZero);   
  38.        
  39.         //add two spriteMenu  
  40.         CCSprite *sprite1 = CCSprite::create("HelloWorld.png");    
  41.         CCSprite *sprite2 = CCSprite::create("HelloWorld.png");    
  42.           
  43.         // Menu    
  44.         CCMenuItemSprite *menuItem1 = CCMenuItemSprite::create(sprite1, sprite1, this, menu_selector(HelloWorld::menu1Callback));    
  45.         menuItem1->setPosition(ccpAdd(CCPointZero, ccp(size.width / 2, size.height / 3)));    
  46.         menuItem1->setScale(0.4f);    
  47.         CCMenuItemSprite *menuItem2 = CCMenuItemSprite::create(sprite2, sprite2, this, menu_selector(HelloWorld::menu1Callback));    
  48.         //menuItem2->setPosition(ccpAdd(ccp(480, 0), ccp(size.width / 2, size.height / 2)));    
  49.         menuItem2->setPosition(ccpAdd(CCPointZero, ccp(size.width / 2, 2*size.height / 3)));    
  50.         menuItem2->setScale(0.4f);    
  51.         CCMenu *menu = CCMenu::create(menuItem1, menuItem2, NULL);    
  52.         
  53.         menu->setPosition(CCPointZero);    
  54.         //addChild in layer  
  55.         layer->addChild(menu);  
  56.        
  57.         scrollView->setPosition(CCPointZero);  
  58.         //这一步是1.0版本没有的,重要!  
  59.         scrollView->setContentOffset(CCPointZero);  
  60.         //layer->setContentSize(CCSizeMake(960, 320));   
  61.         //最重要的就是下面这两步,setViewSize是设置显示的大小;ContenSize是设置总大小,包括显示跟隐藏幕后的  
  62.         scrollView->setViewSize(CCSizeMake(320, 480));//大小要设置得比图片的小。  
  63.         scrollView->setContentSize(CCSizeMake(640, 640));    
  64.         scrollView->setContainer(layer);  
  65.   
  66.         //设置滚动方向,  
  67.         scrollView->setDirection(kCCScrollViewDirectionBoth);  
  68.         scrollView->setDelegate(this);  
  69.   
  70.         this->addChild(scrollView);  
  71.   
  72.         bRet = true;  
  73.     } while (0);  
  74.   
  75.     return bRet;  
  76. }  
  77.   
  78. void HelloWorld::onEnter()  
  79. {  
  80.     CCLayer::onEnter();  
  81.     // 这里的第三个参数一定要设置成false,  
  82.     // true 即HelloWorld层吞噬掉触摸事件  
  83.     // false 即HelloWorld层与CCScrollView对象先后处理触摸事件  
  84.     CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 1, false);  
  85. }  
  86.   
  87. void HelloWorld::onExit()  
  88. {  
  89.     CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);  
  90.     CCLayer::onExit();  
  91. }  
  92.   
  93. bool HelloWorld::ccTouchBegan(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)  
  94. {  
  95.     return true;  
  96. }  
  97.   
  98. void HelloWorld::ccTouchMoved(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)  
  99. {  
  100.     CCLOG("move");  
  101. }  
  102.   
  103. void HelloWorld::ccTouchEnded(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)  
  104. {  
  105.     adjustScrollView();  
  106. }  
  107.   
  108. void HelloWorld::ccTouchCancelled(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)  
  109. {  
  110.     adjustScrollView();  
  111. }  
  112.   
  113. void HelloWorld::adjustScrollView()  
  114. {  
  115.     // 关闭CCScrollView中的自调整  
  116.     scrollView->unscheduleAllSelectors();  
  117.       
  118.     int x = scrollView->getContentOffset().x;  
  119.     int offset = (int) x % 480;  
  120.     // 调整位置  
  121.     CCPoint adjustPos;  
  122.     // 调整动画时间  
  123.     float adjustAnimDelay;  
  124.       
  125.     if (offset < -240) {  
  126.         // 计算下一页位置,时间  
  127.         adjustPos = ccpSub(scrollView->getContentOffset(), ccp(480 + offset, 0));  
  128.         adjustAnimDelay = (float) (480 + offset) / ADJUST_ANIM_VELOCITY;  
  129.     }  
  130.     else {  
  131.         // 计算当前页位置,时间  
  132.         adjustPos = ccpSub(scrollView->getContentOffset(), ccp(offset, 0));  
  133.         // 这里要取绝对值,否则在第一页往左翻动的时,保证adjustAnimDelay为正数  
  134.         adjustAnimDelay = (float) abs(offset) / ADJUST_ANIM_VELOCITY;  
  135.     }  
  136.       
  137.     // 调整位置  
  138.     scrollView->setContentOffsetInDuration(adjustPos, adjustAnimDelay);  
  139. }  
  140.   
  141. void HelloWorld::menu1Callback(CCObject *pSender)  
  142. {  
  143.     CCLOG("menu1Callback");  
  144. }  
  145.   
  146. void HelloWorld::menu2Callback(CCObject *pSender)  
  147. {  
  148.     CCLOG("menu2Callback");  

这篇关于cocos2d-x ScrollView(上)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1139094

相关文章

Cocos2d-x自适应Android屏幕分辨

ndroid下分辨率太多,不太可能为每种分辨率做一套资源,目前一般来说比较流行的是320*480, 800*400, 854*400。当然现在720P的也出来了,但至少目前不是主流机型^_^. 对于不支持的分辨率,我希望的是能够按照屏幕大小按比例缩放,即有了下面的代码。 1:ViewAutoScale 写了一个ViewAutoScale函数,如下:   #include "ViewAuto

cocos2d-x Android实现广告条竖立放置

 2:实现 原理:将屏幕设置为竖屏,然后CCDirector::setDeviceOrientation()设置为cocos2d-x为横屏。            在这种转屏模式下,控件是不会旋转的 缺点:所有Android原生控件仍然是竖立的 注意事项: ccTouchesBegan,ccTouchesMoved, ccTouchesEnded传入的坐标值仍然是屏幕坐标

兔子--计算listview的高度,解决listview与scrollview控件冲突

/** * 计算ListView的高度 * * @param listView */ public void setListViewHeightBasedOnChildren(ListView listView) { // 获取ListView对应的Adapter OrderGoodsAdapter listAdapter = (OrderGoodsAdapter) listView.getAda

ScrollView的android:fillViewport=true

http://stackoverflow.com/questions/2599837/linearlayout-not-expanding-inside-a-scrollview http://blog.csdn.net/linqingf/article/details/6573602 当fillViewport="true" 设置为 true里 , scrollV

ScrollView嵌套listview滑动位置底部bug

三种方案,个人推荐第三种: 1 sv.fullScroll(ScrollView.FOCUS_UP); 2 sv.setScrollY(0); 3 sv.smoothScrollTo(0,20); 滑动冲突解决listView: public class ListViewForScrollView extends ListView {public ListVie

Cocos2d-x 场景切换深入篇

接着上一次的场景切换1,要补充一些内容 如果Last对应的回调函数是这样写的 void MyScene::LastSceneCallback(CCObject* pSender)  {   //CCScene* scene =new MyScene();   //CCLayer* pLayer = new LayerPanda();   //scene->addChild(pLayer

scrollView(下)

这篇继续写scroll,不过这次不是用scrollView这个控件,而是自己编写一段代码实现拖动图片。假想有一张很大的地图,然后屏幕只能显示它的一角,这时候就要通过拖动来查看其他部分。本来是要用scrollView实现这个功能,可用起来始终那么别扭,这不,上午一气之下自己搞了个可以拖动图片的代码。 一、首先在init中添加自己要实现拖动到图片。 [cpp] view plain c

cocos2d-x 重力感应

本文没你想象的那么,,复杂。其实就是通过重力感应控制个小球移动而已。 先看头文件: [cpp] view plain copy #ifndef __HELLOWORLD_SCENE_H__  #define __HELLOWORLD_SCENE_H__    #include "cocos2d.h"  USING_NS_CC;    class HelloWorld : public

ScrollView嵌套RecyclerView再嵌套RecyclerView导致的布局展示不完整问题

背景:页面布局,最外层有个ScrollView,然后里面有个RecyclerView,然后每个RecyclerView的item都是一个RecyclerView 异常:页面展示不完整,最底下的Item 展示一半,在往上滑就滑不动了   解决: // 每一个item渲染完后重新计算外层recyclerview高度// 因为外层的recyclerview是先渲染的,渲染时 内部recyc

Cocos2D-X开发神器CocoCreator使用介绍

你还在为搭建Cocos2d-x开发环境而头痛么,还在为平台移植问题而困扰么,我想大家都想更加快速得进行开发,今天才知道这个神器的,稍微使用了一下,觉得还是挺ok的一个开发工具,所以这里推荐给大家。   可以到下面地址下载:    http://cococreator.com/         更详细的介绍请参考CSDN认证专家小巫的博客文章:  ,手机游戏开发培训;      http:/