Cocos2dx学习笔记(20)——开关控件

继续UI的各种控件,让我们来了解一下开关的使用。

本文仅供个人记录和复习,不用于其他用途

3.x版本改变

变化可以参考上一章,但是这里要说明一下一个3.x的BUG,那就是关于create()函数:

1
2
3
4
5
// 参数分别为“底图”,“打开状态图”,“关闭状态图”,“拨动开关图”
// 这个会出错
create(Sprite* maskSprite, Sprite* onSprite, Sprite* offSprite, Sprite* thumbSprite);
// 应该用这个,必须指定后两个参数,不能为nullptr
create(Sprite* maskSprite, Sprite* onSprite, Sprite* offSprite, Sprite* thumbSprite, Label* onLabel, Label* offLabel);

CCControlSwitch

绑定控件事件的方法

其实和CCControlSlider是类似的:

1
2
3
4
// 绑定控件事件
void addTargetWithActionForControlEvents(CCObject* target, SEL_CCControlHandler action, CCControlEvent controlEvents);
// 删除控件事件
void removeTargetWithActionForControlEvents(CCObject* target, SEL_CCControlHandler action, CCControlEvent controlEvents);

引用头文件和命名空间

1
2
#include "cocos-ext.h"
USING_NS_CC_EXT;

常用操作

1
2
3
4
5
void setOn(bool isOn); // 设置开关状态
void setOn(bool isOn, bool animated); // 设置开关状态
bool isOn(void) { return m_bOn; } // 获取开关状态
bool hasMoved() { return m_bMoved; } // 获取当前开关是否为手动拨动开关(区别于点击拨动)
virtual void setEnabled(bool enabled); // 设置开关是否能操作

代码示例

创建方法

这里分为两种创建方法:

第一种是传入四个参数,首先在init()中初始化:

1
2
3
4
5
6
7
8
9
10
11
CCLabelTTF *label = CCLabelTTF::create("on", "Courier new", 20);
label->setPosition(ccp(240, 120));
CCSprite *bg = CCSprite::create("switch-mask.png");
CCSprite *on = CCSprite::create("switch-off.png");
CCSprite *off = CCSprite::create("switch-on.png");
CCSprite *thumb = CCSprite::create("switch-thumb.png");
CCControlSwitch *controlSwitch = CCControlSwitch::create(bg, on, off, thumb);
controlSwitch->setPosition(ccp(240, 160));
this->addChild(controlSwitch);

当然,我们也可以传入六个参数,也就是使用第二种创建方法:

1
2
3
4
5
6
7
8
9
10
11
CCSprite *bg = CCSprite::create("switch-mask.png");
CCSprite *on = CCSprite::create("switch-off.png");
CCSprite *off = CCSprite::create("switch-on.png");
CCSprite *thumb = CCSprite::create("switch-thumb.png");
CCLabelTTF *switch_on = CCLabelTTF::create("on", "Courier new", 20);
CCLabelTTF *switch_off = CCLabelTTF::create("off", "Courier new", 20);
CCControlSwitch *controlSwitch = CCControlSwitch::create(bg, on, off, thumb, switch_on, switch_off);
controlSwitch->setPosition(ccp(240, 160));
this->addChild(controlSwitch);

效果如下:

这个是第二种方法的效果,我也推荐使用第二种方法,效果更加出色。

实现回调函数

首先,我们要绑定控件事件:

1
2
// 绑定控件事件
controlSwitch->addTargetWithActionForControlEvents(this, cccontrol_selector(HelloWorld::valueChanged), CCControlEventValueChanged);

回调函数实现如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void HelloWorld::valueChanged(CCObject *sender, CCControlEvent controlEvent)
{
// 获取事件的传递者CCControlSwitch
CCControlSwitch *controlSwitch = (CCControlSwitch *)sender;
// 根据开关控件的状态,设置label标签的内容
if(controlSwitch->isOn())
{
label->setString("on");
}
else
{
label->setString("off");
}
}