http://www.cnblogs.com/dudu580231/p/4924192.html原文


cocos2dx ListView 动态加载(代码)

其实是根据上篇文章得出的:

在ListView中加载少量的内容,

然后在滑出界面的时候在加载一部分剩余的内容,

这样实现动态加载!!!

为了看出效果来,需要建立一个场景,然后点击按钮之后实现跳转,进而可以看出等待时间

代码:

 1 MainScene.h
 2 
 3 #ifndef __MAINSCENE_SCENE_H__
 4 #define __MAINSCENE_SCENE_H__
 5 
 6 #include "cocos2d.h"
 7 
 8 // 使用 cocosstudio 1.6 制作的头文件
 9 #include cocos-ext.h10 USING_NS_CC;
11 USING_NS_CC_EXT;
12 using namespace cocos2d::ui; 
13 
14 USING_NS_CC;
15 
16 class MainScene : public cocos2d::cclayer
17 {
18 public:
19      Here's a difference. Method 'init' in cocos2d-x returns bool,instead of returning 'id' in cocos2d-iphone
20     virtual bool init();  
21 
22      there's no 'id' in cpp,so we recommend returning the class instance pointer
23     static cocos2d::CCScene* scene();
24     
25      a selector callback
26     void menuCloseCallback(cocos2d::CCObject*pSender,cocos2d::ui::TouchEventType type);
27 
28      implement the "static node()" method manually
29     CREATE_FUNC(MainScene);
30 };
31 
32 #endif  __MAINSCENE_SCENE_H__
MainScene.cpp


#include MainScene.h"
#include HelloWorldScene.h"

 MainScene::scene(){
    
     'scene' is an autorelease object
    CCScene *scene = CCScene::create();
    
     'layer' is an autorelease object
    MainScene *layer = MainScene::create();

     add layer as a child to scene
    scene->addChild(layer);

     return the scene
    return scene;
}

bool MainScene::init(){

    if ( !cclayer::init() )
    {
        return false;
    }

     以下使用的必须是json文件
    cocos2d::ui::Widget *m_pWidget = GUIReader::shareReader()->widgetFromJsonFile(ListViewItem_1/ListViewItem_1.json");
     创建一个可以装Widge的一个层
    cocos2d::ui::UILayer *m_pUIlayer = cocos2d::ui::UILayer::create();
     使用 addWidget 方法加载 cocosstudio制作的json文件
    m_pUIlayer->addWidget(m_pWidget);
     将 UILayer 添加到场景中
    this->addChild(m_pUIlayer);

     获取按钮
    cocos2d::ui::UIButton *button = dynamic_cast<cocos2d::ui::UIButton*>(m_pUIlayer->getWidgetByName(dybtn_buttonitem"));
    button->setTouchEnabled(true);
    button->addTouchEventListener(this,SEL_TouchEvent(&MainScene::menuCloseCallback));


    true;

}
    
void MainScene::menuCloseCallback(cocos2d::CCObject*pSender,cocos2d::ui::TouchEventType type){

    switch (type)
    {

    case cocos2d::ui::TouchEventType::TOUCH_EVENT_BEGAN:
        {
            cclOG(-- silent -- began -- menuCallBack ---- ");
        }
        break;
    case cocos2d::ui::TouchEventType::TOUCH_EVENT_MOVED:
        {

        }
        case cocos2d::ui::TouchEventType::TOUCH_EVENT_ENDED:
        {
            CCScene *pScene = HelloWorld::scene();
            CCDirector::sharedDirector()->replaceScene(pScene);
        }
        case cocos2d::ui::TouchEventType::TOUCH_EVENT_CANCELED:
        {

        }
        break;

    default:
        break;
    }

}
HelloWorldScene.h
测试ListView的动态加载的场景


#ifndef __HELLOWORLD_SCENE_H__
#define __HELLOWORLD_SCENE_H__

#include ListViewItem.h 使用 cocosstudio 1.6 制作的头文件
#include "
USING_NS_CC;
USING_NS_CC_EXT;
namespace cocos2d::ui; 

class HelloWorld : public cocos2d::cclayer
{
public:

    bool init();  

    static cocos2d::CCScene* scene();

     implement the "static node()" method manually
    CREATE_FUNC(HelloWorld);
    
     往ListView中添加内容,实现动态加载ListView中的内容
    void addobjiceList();



private:

    cocos2d::ui::UIListView *m_pListView;      ListView 对象
};

 __HELLOWORLD_SCENE_H__
HelloWorldScene.cpp


#include UIMyListView.h"

USING_NS_CC_EXT;

USING_NS_CC;

CCScene* HelloWorld::scene()
{
     'layer' is an autorelease object
    HelloWorld *layer = HelloWorld::create();

     on "init" you need to initialize your instance
bool HelloWorld::init()
{
    //////////////////////////////
     1. super init first
    ListView_1/ListView_1.jsonthis->addChild(m_pUIlayer);
    
     获取文件中的 ListView 列表容器
    m_pListView = dynamic_cast<cocos2d::ui::UIListView*>(m_pUIlayer->getWidgetByName(dylv_twolistview"));
    dybtn_button"));

     在动态加载之前,先加载一屏幕的内容
    addobjiceList();
    addobjiceList();
    addobjiceList();
    addobjiceList();

    动态加载listView
    使用方法
    UIMyDynamicListView*            m_pDynamicListView;
    创建动态类
    m_pDynamicListView = UIMyDynamicListView::createExpendDynamicListView();
    将ListView加载到动态类中
    m_pDynamicListView->init(m_pListView);
    当listView加载到顶部时 动态加载的数量
    m_pDynamicListView->setAddCount(1);
    设置listview中Item的总数
    m_pDynamicListView->setItemNeedDynamicCount(50);
    界面类中添加的回调函数  addobjiceList为回调函数 处理listview的信息     就是在外面初始化之后再添加到listView中,这样就可以动态加载了
    m_pDynamicListView->setCallBackFunctionAddItem(HelloWorld::addobjiceList));
    
    true;
}

void HelloWorld::addobjiceList()
{
    for(int i = 0; i < 100; i++)
    {
         创建一个 layout 用来添加另一个 cocosstudio 导出的 json 文件
        cocos2d::ui::Layout *pLayout = cocos2d::ui::Layout::create();
         设置 layout 的大小
        pLayout->setSize(cocos2d::CCSizeMake(70,70));
        for(int i = 0; i < 5; i ++)
        {
             创建另一个 json 文件, 即一个按钮 (使用 cocosstudio 制作)
            ListViewItem *item = ListViewItem::create(i);
             设置按钮的位置 ( 实现三排的效果, 在中间之后一次往后排 )
            item->setPosition(ccp((i)*0));
             将三个 按钮 都添加到一个 layout 中,使其实现在同一排的效果
            pLayout->addChild(item);
        }
        vecLayout.push_back(pLayout);     初始化 100 个
        m_pListView->pushBackCustomItem(pLayout);     将 layout 添加到 ListView 中
    }
}
UIMyListView.h
动态类,主要是这个类的作用




#ifndef _UI_MYLISTVIEW_
#define _UI_MYLISTVIEW_

#include "
USING_NS_CC_EXT;

typedef void (cocos2d::CCObject::*m_AddItemfunction)();


class UI_MyListView: public cocos2d::ui::UIListView
{
public:
    设置listview的选项
    void                setCurSelectedindex(int index);
    设置listview的移动点
    void                setPositionOfContainer(cocos2d::CCPoint pos);
    获得listview的移动点
    cocos2d::CCPoint    getPositionOfContainer();
};

动态加载listView
使用方法
UIMyDynamicListView*            m_pDynamicListView;
创建动态类
m_pDynamicListView = UIMyDynamicListView::createExpendDynamicListView();
将ListView加载到动态类中
m_pDynamicListView->init(m_pServerList);
当listView加载到顶部时 动态加载的数量
m_pDynamicListView->setAddCount(3);
设置listview中Item的总数
m_pDynamicListView->setItemNeedDynamicCount(m_allServers.size());
界面类中添加的回调函数  addobjiceList为回调函数 处理listview的信息
m_pDynamicListView->setCallBackFunctionAddItem(this,(m_AddItemfunction)(&ObjiceLayer::addobjiceList));

class UIMyDynamicListView:public cocos2d::CCObject
{
static    UIMyDynamicListView*    createExpendDynamicListView();         创建动态类用来包裹ListView
    UIMyDynamicListView();
    ~UIMyDynamicListView();

    void                init(cocos2d::ui::UIListView*    listView);         将ListView添加到动态类中
    void                addItemTo();                                     加载的item
    cocos2d::CCObject*    m_pListener;

    void setCallBackFunctionAddItem(cocos2d::CCObject*    pListener,void    (cocos2d::CCObject::*pfunction)())
    {
        m_pListener = pListener;
        m_pCallFunc = pfunction;    
    }
    

    void                setAddCount(unsigned int nCount);                 设置动态加载的数量(即每次滑到底部的时候要加载的数量)
    unsigned int        getAddCount();                                     获取动态加载的数量
    void                setItemNeedDynamicCount(unsigned int nCount);     设置未加载的个数
    unsigned int        getItemNeedDynamicCount();                         获取未加载的个数
private:
     ListView的滑动事件
    void                menuEvent(cocos2d::CCObject*pSender,cocos2d::ui::ScrollviewEventType type);

    m_AddItemfunction                m_pCallFunc;                        // 
    void (cocos2d::CCObject::*m_AddItemfunction)()  m_pCallFuncs;
    bool                            m_bLockAddItem;                         是否加载
    unsigned int                    m_nAddCount;                        每次动态添加的个数
    unsigned int                    m_nItemNeedDynamicCount;            item的剩余未加载数
    cocos2d::ui::UIListView*        m_listView;                             外界传进来的ListView
};
#endif
1 UIMyListView.cpp 2 3 4 #include 5 USING_NS_CC; 6 namespace cocos2d::ui; 7 8 9 void UI_MyListView::setCurSelectedindex(int index) 10 { 11 _curSelectedindex = index; 12 updateInnerContainerSize(); 13 if(_curSelectedindex>0) 14 { 15 float fPercent = float(_curSelectedindex - 1)/(getChildrenCount() - 3); 16 if(fPercent>1.000000f) 17 { 18 fPercent = 1.000000f; 19 } 20 CCScrollViewDirection s = this->get(); 21 if (this->getDirection() == SCROLLVIEW_DIR_HORIZONTAL) 22 { 23 jumpToPercentHorizontal(fPercent*100); 24 } 25 else this->getDirection() == SCROLLVIEW_DIR_VERTICAL) 26 { 27 jumpToPercentVertical(fPercent* 28 } 29 30 } 31 else 32 { 33 34 { 35 jumpToPercentHorizontal(0); 36 } 37 38 { 39 jumpToPercentVertical( 40 } 41 } 42 } 43 void UI_MyListView::setPositionOfContainer(cocos2d::CCPoint pos) 44 { 45 _innerContainer->setPosition(pos); 46 } 47 48 cocos2d::CCPoint UI_MyListView::getPositionOfContainer() 49 { 50 return _innerContainer->getPosition(); 51 } 52 53 54 55 UIMyDynamicListView::UIMyDynamicListView() 56 { 57 58 } 59 60 UIMyDynamicListView::~UIMyDynamicListView() 61 { 62 m_pListener = NULL; 63 m_pCallFunc = NULL; 64 } 65 66 UIMyDynamicListView* UIMyDynamicListView::createExpendDynamicListView() 67 { 68 69 UIMyDynamicListView* widget = new UIMyDynamicListView(); 70 if (widget) 71 { 72 widget->retain(); 73 return widget; 74 } 75 CC_SAFE_DELETE(widget); 76 return NULL; 77 } 78 79 void UIMyDynamicListView::init(cocos2d::ui::UIListView* listView) 80 { 81 if (listView) 82 { 83 m_bLockAddItem = true; 设置未加载 84 m_listView = listView; 85 m_nAddCount = 0; 86 m_nItemNeedDynamicCount = 0; 87 m_listView->addEventListenerScrollView(UIMyDynamicListView::menuEvent)); 88 } 89 90 } 91 92 void UIMyDynamicListView::menuEvent(cocos2d::CCObject*pSender,cocos2d::ui::ScrollviewEventType type) 93 { 94 switch (type) 95 { 96 case cocos2d::ui::SCROLLVIEW_EVENT_SCROLLING: 在ListView滑动的时候添加内容,只要界面滑动就可以添加内容 97 { 98 if (m_bLockAddItem) 99 { 100 addItemTo(); 101 } 102 } 103 break; 104 case cocos2d::ui::SCROLLVIEW_EVENT_SCROLL_TO_BottOM: 在ListView滑动到底部的时候添加内容 105 { 106 if (m_bLockAddItem) 107 { 108 addItemTo(); 109 } 110 } 111 break; 112 case cocos2d::ui::SCROLLVIEW_EVENT_SCROLL_TO_RIGHT: 在ListView滑动到右部的时候添加内容 113 { 114 115 { 116 addItemTo(); 117 } 118 } 119 120 default: 121 122 } 123 } 124 125 每次要添加的内容 126 void UIMyDynamicListView::setAddCount(unsigned int nCount) 127 { 128 m_nAddCount = nCount; 129 } 130 131 unsigned int UIMyDynamicListView::getAddCount() 132 { 133 return m_nAddCount; 134 } 135 136 设置还需要加载的数量 137 void UIMyDynamicListView::setItemNeedDynamicCount(unsigned 138 { 139 m_nItemNeedDynamicCount = nCount; 140 } 141 142 unsigned int UIMyDynamicListView::getItemNeedDynamicCount() 143 { 144 return m_nItemNeedDynamicCount; 145 } 146 147 设置加载函数 148 void UIMyDynamicListView::addItemTo() 149 { 150 如果ListView存在的话 151 if (m_listView) 152 { 153 将其设置为未加载 154 m_bLockAddItem = false; 155 int nAddCount = 0; 设置本次加载的数量 156 当还有要加载的内容时 157 while (m_nItemNeedDynamicCount) 158 { 159 nAddCount++; 将本次加载数量 +1 160 将本次加载数量与每次要加载的数量做比较,本次加载多于每次加载时则不再加载了 161 if (nAddCount>m_nAddCount) 162 { 163 m_bLockAddItem = true; 164 return; 165 } 166 更新未加载的数量 167 m_nItemNeedDynamicCount--; 168 m_listView->pushBackDefaultItem(); 169 if (m_pListener == 0 || m_pCallFunc == 170 { 171 assert(false); 172 173 } 174 (m_pListener->*m_pCallFunc)(/*sender*/); 175 m_listView->sortAllChildren();//在绘画之前,排列所有的孩子数组一次,而不是每次添加或者删除子节点时都排序。 这个方法可以大幅度地提高性能。注解:不要手动调用这个方法,除非一个添加过的子节点将要被删除在这个结构内。176 } 177 } 178 }

cocos2dx ListView 动态加载(代码)的更多相关文章

  1. Html5实现首页动态视频背景的示例代码

    这篇文章主要介绍了Html5实现首页动态视频背景的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  2. ios – 在Swift中动态创建uiviewcontroller

    我想动态创建UIViewController而不创建类或使用Mainstoryboard.我希望它以编程方式发生.这可能吗?

  3. 使用iOS故事板动态调整UILabel的高度

    我有一个标签,它是使用iOSStoryboard布局创建的.但是,标签的内容是动态的,可以在运行时更改.如何确保根据标签中的内容调整标签的高度.我试过了:将行数设置为0设置编辑器–>适合内容的大小.但它们不起作用.标签中的文本仅以单行打印,因此某些文本不会出现在屏幕上.任何帮助将受到高度赞赏.解决方法试试这种方式你的标签应该是0的行数给标签赋予高度约束并选择高度约束然后设置大于等于,它将根据内容自动调整高度

  4. ios – 如何以编程方式动态地对UIButton的背景图像进行着色?

    我正在开发一个应用程序–或者更确切地说是一些可重用的“框架”,我很乐意在它工作时分享它.在此应用程序中,用户应该能够从颜色主题列表中进行选择.因此,应用程序必须能够以某种相当动态的方式对其UI元素进行着色.对于按钮,所有着色都不起作用.必须在此处提供正确着色的背景图像.但是为每个人准备一套背景图像只是第二好的.它不够动态和灵活.最后,解决方案可能归结为为所选和正常状态提供一个单色(灰色)梯度图像,

  5. ios – Firebase动态链接中的customURLScheme是什么?

    在documentation中它说要将以下行添加到我的AppDelegate.swift:根据我的理解,这应该是您在info.plist中添加的相同链接.但是,我很困惑为什么在quickstart-iosrepo他们决定将其等同于“dlscheme”.任何人都可以帮我理解这个方案究竟是什么?

  6. ios – 在动态构建的分段控件的导航栏中自动调整大小

    控制器将UISegmentedControl添加到导航栏.分段控件添加到控制器的viewDidLoad方法的导航栏中,但实际的段是在调用viewDidLoad后动态创建的.显示视图时,我无法自动调整分段大小.他们都被挤压,likeinthispost,虽然这里的决议不适用.如果在将分段控件添加到导航栏的右侧项目之前添加了段,则会自动调整它们的大小并在显示视图时看起来很好.这是我的代码的精简版本,如下所示.我错过了什么?

  7. Autolayout iOS 6动态表格单元格高度

    我有UITableviewCell子类.在这个单元格中,我有2个标签和一个显示评级星的视图.我想要lbl评论的动态高度来适应所有的文本.它应该扩大&根据评论的长度收缩高度.我已经实现了这一点,但没有AutoLayout如下现在我使用AutoLayout功能.如何使用Autolayout实现这一点?

  8. ios – 为什么UIView同时调用init和initWithFrame?

    我注意到当我覆盖init和initWithFrame时:在UIView子类中,两个方法都被调用.即使在我的代码中只有一个是显式调用:TestViewController.m:View1.m:控制台看起来像这样:2013-10-1712:33:46.209test1[8422:60b]initWithFrame2013-10-1712:33:46.211test1[8422:60b]init为什么在

  9. ios – 在React Native中设置ListView的高度

    我需要设置ListView的宽度和高度.当设置宽度按预期工作时,设置高度无效,ListView总是伸展到屏幕的几乎底部.我用这种方式在render方法中创建ListView:这是它的风格:我还尝试通过此命令在方法中设置其高度:当我尝试使用此命令设置宽度时,它可以工作.但设定高度什么都不做.如何将ListView的高度设置为所需的值?

  10. 动态模拟iOS动态类型系统文字大小(UIContentSizeCategory)

    解决方法多么尴尬!

随机推荐

  1. 【cocos2d-x 3.x 学习笔记】对象内存管理

    Cocos2d-x的内存管理cocos2d-x中使用的是上面的引用计数来管理内存,但是又增加了一些自己的特色。cocos2d-x中通过Ref类来实现引用计数,所有需要实现内存自动回收的类都应该继承自Ref类。下面是Ref类的定义:在cocos2d-x中创建对象通常有两种方式:这两中方式的差异可以参见我另一篇博文“对象创建方式讨论”。在cocos2d-x中提倡使用第二种方式,为了避免误用第一种方式,一般将构造函数设为protected或private。参考资料:[1]cocos2d-x高级开发教程2.3节[

  2. 利用cocos2dx 3.2开发消灭星星六如何在cocos2dx中显示中文

    由于编码的不同,在cocos2dx中的Label控件中如果放入中文字,往往会出现乱码。为了方便使用,我把这个从文档中获取中文字的方法放在一个头文件里面Chinese.h这里的tex_vec是cocos2dx提供的一个保存文档内容的一个容器。这里给出ChineseWords,xml的格式再看看ChineseWord的实现Chinese.cpp就这样,以后在需要用到中文字的地方,就先include这个头文件然后调用ChineseWord函数,获取一串中文字符串。

  3. 利用cocos2dx 3.2开发消灭星星七关于星星的算法

    在前面,我们已经在GameLayer中利用随机数初始化了一个StarMatrix,如果还不知道怎么创建星星矩阵请回去看看而且我们也讲了整个游戏的触摸事件的派发了。

  4. cocos2dx3.x 新手打包APK注意事项!

    这个在编译的时候就可以发现了比较好弄这只是我遇到的,其他的以后遇到再补充吧。。。以前被这两个问题坑了好久

  5. 利用cocos2dx 3.2开发消灭星星八游戏的结束判断与数据控制

    如果你看完之前的,那么你基本已经拥有一个消灭星星游戏的雏形。开始把剩下的两两互不相连的星星消去。那么如何判断是GameOver还是进入下一关呢。。其实游戏数据贯穿整个游戏,包括星星消除的时候要加到获得分数上,消去剩下两两不相连的星星的时候的加分政策等,因此如果前面没有做这一块的,最好回去搞一搞。

  6. 利用cocos2dx 3.2开发消灭星星九为游戏添加一些特效

    needClear是一个flag,当游戏判断不能再继续后,这个flag变为true,开始消除剩下的星星clearSumTime是一个累加器ONE_CLEAR_TIME就是每颗星星消除的时间2.连击加分信息一般消除一次星星都会有连击信息和加多少分的信息。其实这些combo标签就是一张图片,也是通过控制其属性或者runAction来实现。源码ComboEffect.hComboEffect.cpp4.消除星星粒子效果消除星星时,为了实现星星爆裂散落的效果,使用了cocos2d提供的粒子特效引擎对于粒子特效不了

  7. 02 Cocos2D-x引擎win7环境搭建及创建项目

    官网有搭建的文章,直接转载记录。环境搭建:本文介绍如何搭建Cocos2d-x3.2版本的开发环境。项目创建:一、通过命令创建项目前面搭建好环境后,怎样创建自己的Cocos2d-x项目呢?先来看看Cocos2d-x3.2的目录吧这就是Cocos2d-x3.2的目录。输入cocosnew项目名–p包名–lcpp–d路径回车就创建成功了例如:成功后,找到这个项目打开proj.win32目录下的Hello.slnF5成功了。

  8. 利用cocos2dx 3.2开发消灭星星十为游戏添加音效项目源码分享

    一个游戏,声音也是非常的重要,其实cocos2dx里面的简单音效引擎的使用是非常简单的。我这里只不过是用一个类对所有的音效进行管理罢了。Audio.hAudio.cpp好了,本系列教程到此结束,第一次写教程如有不对请见谅或指教,谢谢大家。最后附上整个项目的源代码点击打开链接

  9. 03 Helloworld

    程序都有一个入口点,在C++就是main函数了,打开main.cpp,代码如下:123456789101112131415161718#include"main.h"#include"AppDelegate.h"#include"cocos2d.h"USING_NS_CC;intAPIENTRY_tWinMain{UNREFERENCED_ParaMETER;UNREFERENCED_ParaMETER;//createtheapplicationinstanceAppDelegateapp;return

  10. MenuItemImage*图标菜单创建注意事项

    学习cocos2dx,看的是cocos2d-x3.x手游开发实例详解,这本书错误一大把,本着探索求知勇于发现错误改正错误的精神,我跟着书上的例子一起调试,当学习到场景切换这个小节的时候,出了个错误,卡了我好几个小时。

返回
顶部