转自: http://blog.csdn.net/han1558249222/article/details/48104991


容器层的使用

GUI 控件我们大致可以分为两类,**普通控件** 和容器控件,普通控件指的是一些常用的控件,如 UIButton,UILabel,UiSlider 和 UITextField 等控件,而容器控件如 UILayout,UIScrollView,UIListView,UIPageView 等,这些容器控件都有一个特点,它可以作为容器,包含其它控件,虽然所有的控件都能够包含其它控件,但有些控件的职责非常单一,如按钮标签等,并不经常向其添加其它控件。以下详细介绍容器控件的使用方法。

UILayout (Panel)

Panel 作为最主要的容器层,前面我们说过,由 CocoStudio UI 编辑器所创建的 UI 是基于 Panel 来布局的,要想熟练的使用 UI 控件,了解 Panel 以及其属性也是重中之重,既然是容器,容器里面总得有些内容了,Panel 对应得控件名称为 UILayout。

    Size widgetSize = m_pWidget->getSize();

    UILayout *background = dynamic_cast<UILayout*>(m_pUiLayer->getWidgetByName("background_Panel"));

    // Create the layout
    UILayout* layout = UILayout::create();
    layout->setSize(Size(280, 150));
    Size backgroundSize = background->getSize();
    layout->setPosition(Point((widgetSize.width - backgroundSize.width) / 2 +
                            (backgroundSize.width - layout->getSize().width) / 2,
                            (widgetSize.height - backgroundSize.height) / 2 +
                            (backgroundSize.height - layout->getSize().height) / 2));
    m_pUiLayer->addWidget(layout);

    UIButton* button = UIButton::create();
    button->setTouchEnabled(true);
    button->loadTextures("cocosgui/animationbuttonnormal.png", "cocosgui/animationbuttonpressed.png",68); background:transparent">"");
    button->setPosition(Point(button->getSize().width / layout->getSize().height - button->getSize().height / 2));
    layout->addChild(button);

    UIButton* textButton = UIButton::create();
    textButton->setTouchEnabled(true);
    textButton->loadTextures("cocosgui/backtotopnormal.png",68); background:transparent">"cocosgui/backtotoppressed.png",68); background:transparent">"");
    textButton->setTitleText("Text Button");
    textButton->setPosition(Point(layout->getSize().width / layout->getSize().height / 2));
    layout->addChild(textButton);

    UIButton* button_scale9 = UIButton::create();
    button_scale9->setTouchEnabled(true);
    button_scale9->loadTextures("cocosgui/button.png",68); background:transparent">"cocosgui/buttonHighlighted.png",68); background:transparent">"");
    button_scale9->setScale9Enabled(true);
    button_scale9->setSize(Size(100, button_scale9->getContentSize().height));
    button_scale9->setPosition(Point(layout->getSize().width - button_scale9->getSize().width / button_scale9->getSize().height / 2));
    layout->addChild(button_scale9);

如上面代码所示,我们创建了一个layout控件,然后在其中添加了三个控件。m_pUiLayer是当前场景的一个 UILayer ,前面我们介绍过,所有的 UI 控件,都是放在 UILayer 里面,UILayer 管理所有的控件,并添加到当前场景中去。显示效果如下:


我们设置了 layout 的 size 属性,也就是给它一个大小,但是并没有显示出来效果,默认是透明的,我们可以为这个层设置颜色:

layout->setBackGroundColorType(LAYOUT_COLOR_SOLID); layout->setBackGroundColor(Color3B(128,153); background:transparent">128));

除了设置纯色之外,还可以设计渐变颜色:

layout->setBackGroundColorType(LAYOUT_COLOR_GRADIENT); layout->setBackGroundColor(Color3B(64,153); background:transparent">64), Color3B(192,153); background:transparent">192));

当然,除了设置颜色之外,还可以设置我们想要的背景图片:

layout->setSize(Size(150)); layout->setClippingEnabled(true); layout->setBackGroundImage("cocosgui/Hello.png");

如上图显示,我们设置了 size 并且设置了 背景图片,但是不要忘了调用setClippingEnabled方法根据 size 进行裁剪,如果忘了调用,那么会向下面所显示的一样。

除了以上使用方式,还有其它玩法:

layout->setBackGroundImageScale9Enabled("cocosgui/green_edit.png");

使用九宫格图片做为背景,注意启用此功能。

UILayout 显示颜色的模式有三种

LAYOUT_COLOR_GRADIENT
LayoutBackGroundColorType 说明
LAYOUT_COLOR_NONE 透明,没有颜色显示
LAYOUT_COLOR_SOLID 实体,可以设置颜色
渐变颜色

UIPanel 控件的布局方案

UILayout 是作为布局之用,以上都只是修改背景图片,下面除了手动摆放坐标位置的绝对定位,还提供了哪些布局方案呢。

LayoutType LAYOUT_LINEAR_VERTICAL LAYOUT_LINEAR_HORIZONTAL LAYOUT_RELATIVE
LAYOUT_ABSOLUTE 绝对布局
垂直平铺
横向平铺
相对布局
layout->setLayoutType(LAYOUT_LINEAR_VERTICAL); // 或者 layout->setLayoutType(LAYOUT_LINEAR_HORIZONTAL); // 或者 layout->setLayoutType(LAYOUT_RELATIVE);

注意:除了绝对定位之外,如果设置了其它布局方案,那么 UIPanel 会忽略其内部控件本身设置的位置。而此时可以使用提供的UILayoutParameter来设置位置关系,根据布局方案提供了几种布局参数,UILinearLayoutParameterUIRelativeLayoutParameter。下面介绍如何实用布局参数来配合布局设计界面显示效果。

// .... 省略控件创建代码,同前文控件一样 UILinearLayoutParameter* lp1 = UILinearLayoutParameter::create(); lp1->setGravity(LINEAR_GraviTY_CENTER_HORIZONTAL); lp1->setMargin(UIMargin(0,153); background:transparent">10,153); background:transparent">10)); UILinearLayoutParameter* lp2 = UILinearLayoutParameter::create(); lp2->setGravity(LINEAR_GraviTY_CENTER_HORIZONTAL); lp2->setMargin(UIMargin(20,153); background:transparent">5)); UILinearLayoutParameter* lp3 = UILinearLayoutParameter::create(); lp3->setGravity(LINEAR_GraviTY_CENTER_HORIZONTAL); lp3->setMargin(UIMargin(10)); button->setLayoutParameter(lp1); textButton->setLayoutParameter(lp2); button_scale9->setLayoutParameter(lp3);

显示效果如下:

我们看到,分别创建了三个布局参数UILinearLayoutParameter,设置了GravityMargin参数,然后给三个 UIPanel 的内部控件分别设置其布局参数值,已达到如上效果。

这里使用的方案是垂直平铺,而每个布局参数设置的Gravity值为LINEAR_GraviTY_CENTER_HORIZONTAL,也就是说水平剧中显示,而 Margin 则标示控件四周边缘的间距,注意以上的lp2的值为UIMargin(20,20,5),其代表含义,距离左、上、右、下的间距。左值为 20,可以看见textButton相对中间位置向右便宜少数。这是垂直布局,而水平布局除了方向不一,基本使用方式同垂直布局同样。两者也都叫线性布局,使用同样的线性布局参数。下面再看看相对布局:

layout->setLayoutType(LAYOUT_RELATIVE); // 此处省略控件的创建步骤 ... UIRelativeLayoutParameter* rp1 = UIRelativeLayoutParameter::create(); rp1->setAlign(RELATIVE_ALIGN_PARENT_TOP_RIGHT); UIRelativeLayoutParameter* rp2 = UIRelativeLayoutParameter::create(); rp2->setAlign(RELATIVE_ALIGN_PARENT_LEFT_CENTER_VERTICAL); UIRelativeLayoutParameter* rp3 = UIRelativeLayoutParameter::create(); rp3->setAlign(RELATIVE_ALIGN_PARENT_RIGHT_BottOM); button->setLayoutParameter(rp1); textButton->setLayoutParameter(rp2); button_scale9->setLayoutParameter(rp3);

这里创建了三个布局属性,设置了不同的 "停靠" 参数Align

UIScrollView 滚动视图

除了布局容器,我们常用的还有滚动层容器,它可以扩大我们的显示控件,当内容元素很多时,尤为有用。可以设置为两个方向,横向或者是竖向。

UIScrollView* scrollView = UIScrollView::create(); scrollView->setTouchEnabled(true); scrollView->setSize(Size(150)); Size backgroundSize = background->getContentSize(); scrollView->setPosition(Point((widgetSize.width - backgroundSize.width) / 2 + (backgroundSize.width - scrollView->getSize().width) / (widgetSize.height - backgroundSize.height) / 2 + (backgroundSize.height - scrollView->getSize().height) / 2)); m_pUiLayer->addWidget(scrollView); UIImageView* imageView = UIImageView::create(); imageView->loadTexture("cocosgui/ccicon.png"); float innerWidth = scrollView->getSize().width; float innerHeight = scrollView->getSize().height + imageView->getSize().height; scrollView->setInnerContainerSize(Size(innerWidth, innerHeight)); imageView->setPosition(Point(innerWidth / imageView->getSize().height / 2)); scrollView->addChild(imageView); // 为 scrollview 添加其它控件,省略

请看如图效果,这里创建了一个 ScrollView 控件,并且添加了一些内部元素,以完成布局,控件内容超出显示区域,我们可以通过上下拖动,来显示上下未未显示的不分。

注意: imageView 设置的位置在 scrollview 之外,可以通过 scrollview 的 setInnerContainerSize 方法设置包含内容的区域大小,在拖动的过程中,边界检查。

如果是设置横向的拖动效果,我们只需要设置 InnerContainerSize 的 宽度大于控件的大小,高度相同,就能实现横向的拖动效果。

UIListView

ListView 继承自 ScrollView,所以 ScrollView 里面有的功能,特性,在 ListView 中也都能体现出来。那么 ListView 相比较 ScrollView 多了些什么呢?还是先从使用方法上开始:

UIListView* lv = UIListView::create(); UIButton* model = UIButton::create(); model->loadTextures(""); lv->setItemmodel(model); for (int i=0; i<20; i++) { lv->pushBackDefaultItem(); } lv->setItemsMargin(10); lv->setGravity(LISTVIEW_GraviTY_CENTER_HORIZONTAL); lv->setSize(Size(100)); lv->setBackGroundColorType(LAYOUT_COLOR_SOLID); lv->setBackGroundColor(Color3B::GREEN); lv->setPosition(Point(100)); m_pUiLayer->addWidget(lv);

如图,但不能很好的看到效果,这里是类似 ScrollView 的实现,可以实现拖动,并且有二十个按钮在这其中。先说说普通的属性,通过ItemsMargin设置每个元素的间距, 通过Gravity设置布局方案,这里是横向剧中显示。

lv->setItemmodel(model)为 ListView 设置了默认的项 (Default Item),然后通过一个 for 循环,添加了 20 次此默认的项,注意这 20 次并不是说, model 被添加了 20 次,二十在每次添加的时候都对 model 做了一个 克隆,它们拥有相同的属性,但却不是同一个对象。

除了使用pushBackDefaultItem()为 ListView 添加项之外,我们还可以通过以下方法添加:

方法 insertDefaultItem(int index) pushBackCustomItem(UIWidget* item) insertCustomItem(UIWidget* item,int index)
pushBackDefaultItem() 添加一个默认项
插入一个默认项,有序的
添加一个新项
插入一个新项

以上是提供的一些添加项的方法,除了以上还有一些删除的方法,获取的方法,以便我们能够灵活的操作其中的每个元素:

removeItem(int index) removeLastItem() getItem(unsigned int index) getItems() getIndex(UIWidget *item)
移除一个项
移除最后一个项
根据索引获取一个项
获取所有项,返回 Array 集合
获取一个项的索引

UIPageView

除了可以滚动显示的 ScrollView , 根据项来显示列表的控件之外,还有可以根据 页 来显示 PageView。 PageVew 可以让我们整页整页的显示内容,并且可以做自动对齐,什么是自动对齐,就像你的书翻页,只翻了一半,它回自动帮你翻过去一样。

UIPageView* pageView = UIPageView::create(); pageView->setTouchEnabled(true); pageView->setSize(Size(240,153); background:transparent">130)); Size backgroundSize = background->getContentSize(); pageView->setPosition(Point((widgetSize.width - backgroundSize.width) / 2 + (backgroundSize.width - pageView->getSize().width) / (widgetSize.height - backgroundSize.height) / 2 + (backgroundSize.height - pageView->getSize().height) / 2)); for (int i = 0; i < 3; ++i) { UILayout* layout = UILayout::create(); layout->setSize(Size(130)); UIImageView* imageView = UIImageView::create(); imageView->setTouchEnabled(true); imageView->setScale9Enabled(true); imageView->loadTexture("cocosgui/scrollviewbg.png"); imageView->setSize(Size(130)); imageView->setPosition(Point(layout->getSize().width / 2)); layout->addChild(imageView); UILabel* label = UILabel::create(); label->setText(CCString::createWithFormat("page %d", (i + 1))->getCString()); label->setFontName(font_UIPageViewTest); label->setFontSize(30); label->setColor(Color3B(192)); label->setPosition(Point(layout->getSize().width / 2)); layout->addChild(label); pageView->addPage(layout); } pageView->addEventListenerPageView(this, pagevieweventselector(UIPageViewTest::pageViewEvent)); m_pUiLayer->addWidget(pageView);

如图显示,创建了一个 PageView 对象 pageView,设置大小为 "Size(240,130)",这也就是它的显示区域大小了。我们使用一个 for 循环,添加了三个同样的元素 UILayout ,每个 UILayout 的大小也都是Size(240,130),所以 PageView 一次正好能够显示一个项的内容,也就是 "页"。至于每个页的 UILayout 里面装着什么,那就是根据自己的需要而定了。然后使用pageView->addPage(layout)添加一个页,需要注意的是,这里所添加的必须是UILayout类型对象或者其派生类对象。

PageView 虽然实现了滑动,滚动的效果,但它并不是继承自 ScrollView 的,而是直接继承自 UILayout 的,那怎么实现滚动的呢,它集成并且实现了UIScrollInterface类型,这赋予了它可以滚动的属性。ScrollView 也是同样。

各个控件组成了丰富的 GUI 界面,而容器层则是其骨架,通过它的布局,来达到我们想要的效果。从 Panel 到 ScrollView ,Listview 和 PageView ,根据实际的需要灵活的组织可以让我们的界面显示的更为友好。

cocos2dx-ui的分类与使用的更多相关文章

  1. HTML5自定义视频播放器源码

    这篇文章主要介绍了HTML5自定义视频播放器源码,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下

  2. HTML5自定义mp3播放器源码

    这篇文章主要介绍了HTML5自定义mp3播放器源码,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下

  3. html5自定义video标签的海报与播放按钮功能

    这篇文章主要介绍了html5自定义video标签的海报与播放按钮功能,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下

  4. CSS中实现动画效果-附案例

    这篇文章主要介绍了 CSS中实现动画效果并附上案例代码及实现效果,就是CSS动画样式处理,动画声明需要使用@keyframes name,后面的name是人为定义的动画名称,下面我们来看看文章的具体实现内容吧,需要的小伙伴可以参考一下

  5. h5页面背景图很长要有滚动条滑动效果的实现

    这篇文章主要介绍了h5页面背景图很长要有滚动条滑动效果的实现,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  6. html5借用repeating-linear-gradient实现一把刻度尺(ruler)

    这篇文章主要介绍了html5借用repeating-linear-gradient实现一把刻度尺,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  7. 如何在Canvas中添加事件的方法示例

    这篇文章主要介绍了如何在Canvas中添加事件的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  8. HTML5自定义元素播放焦点图动画的实现

    这篇文章主要介绍了HTML5自定义元素播放焦点图动画的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  9. 有关HTML5页面在iPhoneX适配问题

    这篇文章主要介绍了有关HTML5页面在iPhoneX适配问题,需要的朋友可以参考下

  10. html5简介及新增功能介绍

    这篇文章主要介绍了html5简介及新增功能介绍,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

随机推荐

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

返回
顶部