cocos2dx-ui的分类与使用
容器层的使用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 的 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 并且设置了 背景图片,但是不要忘了调用 除了以上使用方式,还有其它玩法: layout->setBackGroundImageScale9Enabled("cocosgui/green_edit.png");
使用九宫格图片做为背景,注意启用此功能。 UILayout 显示颜色的模式有三种
UIPanel 控件的布局方案UILayout 是作为布局之用,以上都只是修改背景图片,下面除了手动摆放坐标位置的绝对定位,还提供了哪些布局方案呢。
layout->setLayoutType(LAYOUT_LINEAR_VERTICAL);
// 或者
layout->setLayoutType(LAYOUT_LINEAR_HORIZONTAL);
// 或者
layout->setLayoutType(LAYOUT_RELATIVE);
注意:除了绝对定位之外,如果设置了其它布局方案,那么 UIPanel 会忽略其内部控件本身设置的位置。而此时可以使用提供的 // .... 省略控件创建代码,同前文控件一样
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);
显示效果如下: 我们看到,分别创建了三个布局参数 这里使用的方案是垂直平铺,而每个布局参数设置的 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);
这里创建了三个布局属性,设置了不同的 "停靠" 参数 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 的 宽度大于控件的大小,高度相同,就能实现横向的拖动效果。 UIListViewListView 继承自 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 的实现,可以实现拖动,并且有二十个按钮在这其中。先说说普通的属性,通过 除了使用
以上是提供的一些添加项的方法,除了以上还有一些删除的方法,获取的方法,以便我们能够灵活的操作其中的每个元素:
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 的大小也都是 PageView 虽然实现了滑动,滚动的效果,但它并不是继承自 ScrollView 的,而是直接继承自 UILayout 的,那怎么实现滚动的呢,它集成并且实现了 各个控件组成了丰富的 GUI 界面,而容器层则是其骨架,通过它的布局,来达到我们想要的效果。从 Panel 到 ScrollView ,Listview 和 PageView ,根据实际的需要灵活的组织可以让我们的界面显示的更为友好。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 一次搞懂 Assets Pipeline
- Oracle数据传输MySQL中文编码问题
- 在Ruby中编写一个简单的Windows 7 GUI应用程序[已关闭]
- Arcgis+Oracle开发环境配置
- ajax – 在GET上期待JSON结果时,Angularjs $http“XML解析错
- Vue入门学习笔记 基本概念、对象、过滤器、指令等
- postgresql – 我可以使一个plpgsql函数返回一个整数,而不使
- 平均提速20倍!Oracle 12c In-Memory最佳实践
- ruby-on-rails – 在Rails中创建可拖动可排序列表的最有效方
- 【cocos2d-x 3.7 飞机大战】 决战南海I (六) 保存玩家数据