Cocos2dx学习笔记(22)——按钮控件

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

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

3.x版本改变

CCControlState改为Control::State

1
2
3
4
NORMAL // 正常
HIGH_LIGHTED // 高亮(即在内部触摸状态下)
DISABLED // 禁用
SELECTED // 选中

CCControlEvent改为Control::EventType

1
2
3
4
5
6
7
8
TOUCH_DOWN // 刚刚开始触摸按钮时
DRAG_INSIDE // 在内部拖动时(保持触摸状态下)
DRAG_OUTSIDE // 在外部拖动时(保持触摸状态下)
DRAG_ENTER // 拖动刚进入内部时(保持触摸状态下)
DRAG_EXIT // 拖动刚离开内部时(保持触摸状态下)
TOUCH_UP_INSIDE // 在内部抬起手指(保持触摸状态下)
TOUCH_UP_OUTSIDE // 在外部抬起手指(保持触摸状态下)
TOUCH_CANCEL // 取消触点

其他的可以参照之前的文章

什么是按钮

其实这个和菜单有点像,菜单中的子选项就类似按钮。按钮采用的是CCScale9Sprite,因为点击按钮时常常有放大的效果,所以使用点九图是为了防止失真。

按钮状态CCControlState

1
2
3
4
CCControlStateNormal // 正常
CCControlStateHighlighted // 高亮(即在内部触摸状态下)
CCControlStateDisabled // 禁用
CCControlStateSelected // 选中

按钮事件CCControlEvent

1
2
3
4
5
6
7
8
CCControlEventTouchDown // 刚刚开始触摸按钮时
CCControlEventTouchDragInside // 在内部拖动时(保持触摸状态下)
CCControlEventTouchDragOutside // 在外部拖动时(保持触摸状态下)
CCControlEventTouchDragEnter // 拖动刚进入内部时(保持触摸状态下)
CCControlEventTouchDragExit // 拖动刚离开内部时(保持触摸状态下)
CCControlEventTouchUpInside // 在内部抬起手指(保持触摸状态下)
CCControlEventTouchUpOutside // 在外部抬起手指(保持触摸状态下)
CCControlEventTouchCancel // 取消触点

绑定按钮事件的方法

1
2
3
4
5
6
7
// 绑定控件事件
// addTargetWithActionForControlEvents(this, cccontrol_selector(HelloWorld::touchDownAction), CCControlEventTouchDown);
void addTargetWithActionForControlEvents(CCObject* target, SEL_CCControlHandler action, CCControlEvent controlEvents);
// 删除控件事件
// removeTargetWithActionForControlEvents(this, cccontrol_selector(HelloWorld::touchDownAction), CCControlEventTouchDown);
void removeTargetWithActionForControlEvents(CCObject* target, SEL_CCControlHandler action, CCControlEvent controlEvents);

头文件和命名空间

1
2
#include "cocos-ext.h" // 包含cocos-ext.h头文件
using namespace cocos2d::extension; // 引用cocos2d::extension命名空间

常用操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
class CCControlButton : public CCControl
{
// 使用点九图CCScale9Sprite,按钮中不带标签CCLabel
static CCControlButton* create(CCScale9Sprite* sprite);
// 使用标签label,可以是CCLabelTTF、CCLabelBMFont
static CCControlButton* create(CCNode* label, CCScale9Sprite* backgroundSprite);
// title:标签内容
// fontName:字体资源,如 "Arial"
// fontSize:字体大小,默认 12
// 内部创建的标签为CCLabelTTF
static CCControlButton* create(std::string title, const char* fontName, float fontSize);
// 当前显示的标签内容,只读getCurrentTitle
CC_SYNTHESIZE_READONLY(CCString*, m_currentTitle, CurrentTitle);
// 当前显示的标签内容颜色,只读getCurrentTitleColor
CC_SYNTHESIZE_READONLY_PASS_BY_REF(ccColor3B, m_currentTitleColor, CurrentTitleColor);
// 设置当前CCControlState下的标签,set/get
CC_SYNTHESIZE_RETAIN(CCNode*, m_titleLabel, TitleLabel);
// 设置当前CCControlState下的背景精灵,set/get
CC_SYNTHESIZE_RETAIN(CCScale9Sprite*, m_backgroundSprite, BackgroundSprite);
// 设置按钮大小,若标签label大小大于按钮,将自动扩展,set/get。
CC_PROPERTY(CCSize, m_preferredSize, PreferredSize);
// 设置在指定CCControlState下的 字体标签
// 若未设置标签,默认为CCButtonStateNormal状态的字体标签
// 字体标签可以是CCLabelTTF、CCLabelBMFont
virtual void setTitleLabelForState(CCNode* label, CCControlState state);
virtual CCNode* getTitleLabelForState(CCControlState state);
// 设置在指定CCControlState下的 标签内容
// 若未设置标签,默认返回CCButtonStateNormal状态的标签内容
virtual void setTitleForState(CCString* title, CCControlState state);
virtual CCString* getTitleForState(CCControlState state);
// 设置在指定CCControlState下的 标签颜色
virtual void setTitleColorForState(ccColor3B color, CCControlState state);
virtual const ccColor3B getTitleColorForState(CCControlState state);
// 设置在指定CCControlState下的 标签为CCLabelTTF
// fntFile为字体资源名,如 "Arial"
virtual void setTitleTTFForState(const char* fntFile, CCControlState state);
virtual const char* getTitleTTFForState(CCControlState state);
// 设置在指定CCControlState下的 CCLabelTTF标签的字体大小
virtual void setTitleTTFSizeForState(float size, CCControlState state);
virtual float getTitleTTFSizeForState(CCControlState state);
// 设置在指定CCControlState下的 标签为CCLabelBMFont
// fntFile为字体资源名,如 *.fnt
virtual void setTitleBMFontForState(const char* fntFile, CCControlState state);
virtual const char * getTitleBMFontForState(CCControlState state);
// 使用点九图CCScale9Sprite,设置在指定CCControlState下的背景精灵
virtual void setBackgroundSpriteForState(CCScale9Sprite* sprite, CCControlState state);
// 使用精灵帧CCSpriteFrame,设置在指定CCControlState下的背景精灵
// 其实在内部实现的代码,实际上是利用精灵帧spriteFrame创建了点九图CCScale9Sprite作为背景精灵
virtual void setBackgroundSpriteFrameForState(CCSpriteFrame* spriteFrame, CCControlState state);
// 获取在指定CCControlState下的背景图
virtual CCScale9Sprite* getBackgroundSpriteForState(CCControlState state);
virtual void setEnabled(bool enabled); // 是否启用
virtual void setSelected(bool enabled); // 是否选中
virtual void setHighlighted(bool enabled); // 是否高亮
};