前面我们介绍过 UIButton 的简单使用方法,用以控制一个 UILabel 的显示内容。UIImageView 的使用还很简单,除此之外 GUI 系统里面还为我们提供了很多有用的控件,如 UITextButton,UICheckBox,UiSlider 等等。

UITextButton

    UIButton* textButton = UIButton::create();
    textButton->setTouchEnabled(true);
    textButton->loadTextures("cocosgui/backtotopnormal.png", "cocosgui/backtotoppressed.png",68); background:transparent">"");
    textButton->setTitleText("Text Button");
    textButton->setPosition(Point(widgetSize.width / 2.0f, widgetSize.height / 2.0f));
    textButton->addTouchEventListener(this, toucheventselector(UITextButtonTest::touchEvent));        
    m_pUiLayer->addWidget(textButton);

既然是按钮,肯定需要支持可触摸操作,然后调用loadTextures方法加载按钮图片,注意第三个参数是按钮禁用时显示的图片,可根据自己的选择是否设置,这里要提一下的是第四个参数,请看如下方法原型:

void loadTextures(const char* normal,const char* selected,const char* disabled,TextureResType texType = UI_TEX_TYPE_LOCAL);

最后一个参数代表着图片类型,默认为UI_TEX_TYPE_LOCAL,着意味使用的是普通图片,还有另一种类型UI_TEX_TYPE_PLIST,这表示使用的图片自来来自于 plist 文件的打包资源,内部会依此决定使用Sprite创建还是SpriteFrame来创建实际的显示精灵,可以设置显示的文字内容以及按钮的回调函数,按钮回调函数的使用方式和普通按钮相同,除了使用一般图片之外,我们还可以使用 九宫格 图片,注意设置Size

true); textButton->setScale9Enabled("cocosgui/button.png",68); background:transparent">"cocosgui/buttonHighlighted.png",68); background:transparent">""); textButton->setSize(Size(180, textButton->getContentSize().height * 1.5f)); textButton->setTitleText("Text Button scale9 render"); textButton->setPosition(Point(widgetSize.width /

UICheckBox

我们经常在上网提交表单的时候,经常看到一种控件,复选框,它可以完成多个项目的 "勾选" 操作。并且有两种状态,"选中" 和 "非选中"。

UICheckBox* checkBox = UICheckBox::create(); checkBox->setTouchEnabled(true); checkBox->loadTextures("cocosgui/check_Box_normal.png", "cocosgui/check_Box_normal_press.png",68); background:transparent">"cocosgui/check_Box_active.png",68); background:transparent">"cocosgui/check_Box_normal_disable.png",68); background:transparent">"cocosgui/check_Box_active_disable.png"); checkBox->setPosition(Point(widgetSize.width / 2.0f)); checkBox->addEventListenerCheckBox(this, checkBoxselectedeventselector(UICheckBoxTest::selectedEvent)); m_pUiLayer->addWidget(checkBox);

看到这里,属性没多少,但是图片却加载了很多,两种状态,两种状态的禁用图片,还有一个按下时显示的图片,有了这五张图片,才能算是一个完整的复选框控件。通过addEventListenerCheckBox方法设置回调函数:

void UICheckBoxTest::selectedEvent(Object* pSender,CheckBoxEventType type) { switch (type) { case gui::CHECKBox_STATE_EVENT_SELECTED: m_pdisplayValueLabel->setText(CCString::createWithFormat("Selected")->getCString()); break; case gui::CHECKBox_STATE_EVENT_UNSELECTED: m_pdisplayValueLabel->setText(CCString::createWithFormat("Unselected")->getCString()); break; default: break; } }

对于一个复选框来说,有选中和未选中状态,当我们点击它状态发生改变的时候,我们通过回调函数来做一些逻辑上的处理,比如记录当前控件的选中状态,或者如上面所示,设置一个标签的显示内容,以通知当前的状态已经修改。

UiSlider

如果你想控制系统的声音大小,或者类似的操作时,滑动条是非常合适的选择。

UiSlider* slider = UiSlider::create(); slider->setTouchEnabled(true); slider->loadBarTexture("cocosgui/sliderTrack.png"); slider->loadSlidBallTextures("cocosgui/sliderThumb.png",68); background:transparent">""); slider->loadProgressBarTexture("cocosgui/sliderProgress.png"); slider->setPosition(Point(widgetSize.width / 2.0f)); slider->addEventListenerSlider(this, sliderpercentchangedselector(UiSliderTest::percentChangedEvent)); m_pUiLayer->addWidget(slider);

我们分别使用不同的方法加载图片,loadBarTexture所加载的是滑动条背景图,loadSlidBallTextures方法所加载的是可滑动部件的三种状态下图片,也就是我们可以拖动的中间那个圆球。 而loadProgressBarTexture方法则显示了滑动条的具体进度。当然最后不要忘了,它也有回调函数,我们可能需要实时的记录它的当前状态值:

void UiSliderTest::percentChangedEvent(Object *pSender, SliderEventType type) { if (type == SLIDER_PERCENTCHANGED) { UiSlider* slider = dynamic_cast<UiSlider*>(pSender); int percent = slider->getPercent(); m_pdisplayValueLabel->setText(CCString::createWithFormat("Percent %d", percent)->getCString()); } }

通过pSender向下转型获取到 UiSlider ,然后获取其百分比即可,UiSlider 可以使用九宫格图片来节省 UI 资源大小。

UILoadingBar

与滑动条相反的是进度条,为什么这么说呢?一个是手动控制进度,返回当前值,一个是手动设置值,后更新其显示,所以说它们是相反的,比如我们自动加载一些图片资源,我们就可以使用进度条来标示它的加载进度,一下是它的使用方法:

UILoadingBar* loadingBar = UILoadingBar::create(); loadingBar->setName("LoadingBar"); loadingBar->loadTexture("cocosgui/sliderProgress.png"); loadingBar->setPercent(0); loadingBar->setPosition(Point(widgetSize.width / 2.0f + loadingBar->getSize().height / 4.0f)); m_pUiLayer->addWidget(loadingBar);

以上的代码当然仅仅是初始化,想要实时的跟新显示其值,我们需要需要不停的为它通过setPercent方法更新属性值。在启动一个场景的时候,我们调用scheduleUpdate();并实现update方法,以保证每一帧都调用,然后我们在此update方法里面实现更新进度条的方法:

void UILoadingBarTest_Left::update(float delta) { m_nCount++; if (m_nCount > 100) { m_nCount = 0; } UILoadingBar* loadingBar = dynamic_cast<UILoadingBar*>(m_pUiLayer->getWidgetByName("LoadingBar")); loadingBar->setPercent(m_nCount); }

这是由 0 开始递增的值,所以显示的效果是从左到右的进度效果。如果你想让它显示从右到左的加载效果呢。递减操作m_nCount--么?当然不是,这只是进度条的值递减,而不是从右到左的进度递增,如果想要从右到左,需要设置 " loadingBar->setDirection(LoadingBarTypeRight);" 属性,此控件也支持九宫格图片的显示。

UILabelAtlas

UILabelAtlas 控件可以显示由图片拼接而成的数字标签:

UILabelAtlas* labelAtlas = UILabelAtlas::create(); labelAtlas->setProperty("1234567890",68); background:transparent">"cocosgui/labelatlas.png", 17,153); background:transparent">22,68); background:transparent">"0"); labelAtlas->setPosition(Point((widgetSize.width) / 2,153); background:transparent">2.0f)); m_pUiLayer->addWidget(labelAtlas);

这个控件的使用比较简单,在老的版本中,使用 Label 的效率不高,使用 LabelAtlas 是非常好的替代方案,但是 3.0 版本优化了 Label 的内部实现机制,提高了很多效率。这里使用 Atlas 的另一个好处是可以使用自定义的丰富的显示效果。

UILabelBMFont

除了上面的 UILabelAtlas 控件之外,要显示一个标签,还可以通过 UILabelBMFont 控件创建。

UILabelBMFont* labelBMFont = UILabelBMFont::create(); labelBMFont->setFntFile("cocosgui/bitmapFontTest2.fnt"); labelBMFont->setText("BMFont"); labelBMFont->setPosition(Point(widgetSize.width / 2.0f + labelBMFont->getSize().height / 8.0f)); m_pUiLayer->addWidget(labelBMFont);

UILabelBMFont 和 UILabelAtlas 一样,都是通过一张图片来保存需要显示的信息,但是 Atlas 更为小巧,图片裁剪的参数可以直接设置,而 BMFont 则不然,每张图片配合一个以 ".fnt" 为后缀的文件,里面记录了文字信息到图片的映射,所以我们可以很容易的使用它,并且同样提供了很多丰富的显示效果。

UITextArea

文本域控件可以帮我们自动处理一些区域性的问题,如自动换行等,这对灵活的 UI 布局尤为重要:

UILabel* textArea = UILabel::create(); textArea->setTextAreaSize(Size(280,153); background:transparent">150)); textArea->setTextHorizontalAlignment(TextHAlignment::CENTER); textArea->setText("TextArea widget can line wrap"); textArea->setFontName("AmericanTypewriter"); textArea->setFontSize(32); textArea->setPosition(Point(widgetSize.width / widgetSize.height / 2 - textArea->getSize().height / 8)); m_pUiLayer->addWidget(textArea);

一个文本域,需要知道它的大小,对齐方式(每一行所显示的文字,根据单子的长短,可能每行的长度不一,使用setTextHorizontalAlignment来设置,有: 左对齐,右对齐 和 剧中对齐),文本显示内容,字体大小和字体等信息。

UITextField

文本输入框是一个非常重要的控件,它可以调用设备的输入系统,接受用户输入的文字内容。如一个登录界面的用户名,密码等信息。

UITextField* textField = UITextField::create(); textField->setTouchEnabled(true); textField->setFontName(font_UITextFieldTest); textField->setFontSize(30); textField->setPlaceHolder("input words here"); textField->setPosition(Point(widgetSize.width / 2.0f)); textField->addEventListenerTextField(this, textfieldeventselector(UITextFieldTest::textFieldEvent)); m_pUiLayer->addWidget(textField);

我们设置好属性,启用可触摸选项,等待用户的触摸,以执行文字录入操作。setPlaceHolder可以作为提示文字而存在,当控件没有显示的文字内容时。注意这里的回调函数有很多中状态:

void UITextFieldTest::textFieldEvent(Object *pSender, TextFiledEventType type) { switch (type) { case TEXTFIELD_EVENT_ATTACH_WITH_IME: { UITextField* textField = dynamic_cast<UITextField*>(pSender); Size screenSize = CCDirector::getInstance()->getWinSize(); textField->runAction(CCMoveto::create(0.225f, Point(screenSize.width / screenSize.height / 2.0f + textField->getContentSize().height / 2.0f))); m_pdisplayValueLabel->setText(CCString::createWithFormat("attach with IME")->getCString()); } break; case TEXTFIELD_EVENT_DETACH_WITH_IME: { UITextField* textField = dynamic_cast<UITextField*>(pSender); Size screenSize = CCDirector::getInstance()->getWinSize(); textField->runAction(CCMoveto::create(0.175f, Point(screenSize.width / "detach with IME")->getCString()); } break; case TEXTFIELD_EVENT_INSERT_TEXT: m_pdisplayValueLabel->setText(CCString::createWithFormat("insert words")->getCString()); break; case TEXTFIELD_EVENT_DELETE_BACKWARD: m_pdisplayValueLabel->setText(CCString::createWithFormat("delete word")->getCString()); break; default: break; } }

首先它会有四种事件类型,如下:

TEXTFIELD_EVENT_INSERT_TEXT TEXTFIELD_EVENT_DELETE_BACKWARD
事件类型 说明
TEXTFIELD_EVENT_ATTACH_WITH_IME 激活输入时触发
TEXTFIELD_EVENT_DETACH_WITH_IME 输入结束时触发
插入文字时触发
删除文字时触发

根据事件的类型,我们能实时的获取控件内容或者对控件的属性修改等其它逻辑操作。我们可以通过textField->setMaxLength(3);来设置控件的最大文字长度。

通常在一个登录界面,我们会设一个用户名框以及一个密码框,以上可以用作用户名框,当然此控件也支持密码框的特性:

textField->setPasswordEnabled(true); textField->setPasswordStyleText("*");

首先设置启用密模式,然后设置一个替换符即可。

原文来自:http://www.cocos2d-x.org/docs/manual/framework/native/wiki/widget/zh

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

常用控件介绍的更多相关文章

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

返回
顶部