Cocos2d-x中提供了文本框控件CCTextFieldTTF实现文字输入功能。
CCTextFieldTTF预留了代理CCTextFieldDelegate处理通知事件。
一、CCTextFieldTTF 类部分代码如下:
class CC_DLL CCTextFieldTTF : public CCLabelTTF, public CCIMEDelegate
{
public:
/** creates a CCTextFieldTTF from a fontname, alignment, dimension and font size */
static CCTextFieldTTF * textFieldWithPlaceHolder(const char *placeholder, const CCSize& dimensions, CCTextAlignment alignment, const char *fontName, float fontSize);
/** creates a CCLabelTTF from a fontname and font size */
static CCTextFieldTTF * textFieldWithPlaceHolder(const char *placeholder, const char *fontName, float fontSize);
/** initializes the CCTextFieldTTF with a font name, alignment, dimension and font size */
bool initWithPlaceHolder(const char *placeholder, const CCSize& dimensions, CCTextAlignment alignment, const char *fontName, float fontSize);
/** initializes the CCTextFieldTTF with a font name and font size */
bool initWithPlaceHolder(const char *placeholder, const char *fontName, float fontSize);
/** Open keyboard and receive input text. */
virtual bool attachWithIME();
/** End text input and close keyboard.*/
virtual bool detachWithIME();
// input text property
public:
virtual void setString(const char *text);
virtual const char* getString(void);
// place holder text property
// place holder text displayed when there is no text in the text field.
public:
virtual void setPlaceHolder(const char * text);
virtual const char * getPlaceHolder(void);
public:
virtual void setSecureTextEntry(bool value);
virtual bool isSecureTextEntry();
};
const char* getString(void):获取文本框内容。
void setString(const char *text):设置文本框内容。
bool attachWithIME():激活输入法。
bool detachWithIME():取消激活输入法。
setPlaceHolder(const char * text):设置文本框内提示文字。
const char * getPlaceHolder(void):获取文本框内提示文字。
bool isSecureTextEntry():判断是否是安全输入。
实例:仅使用CCTextFieldTTF实现文字输入。
CCTextFieldTTF * text = CCTextFieldTTF::textFieldWithPlaceHolder("Please Input", "Arial", 20);
text->setPosition(ccp(200,200));
text->setPlaceHolder("Enter Your Name");
text->setString("Gong");
text->attachWithIME();
addChild(text);
CCLog("%s", text->getPlaceHolder());
CCLog("%s", text->getString());
二、CCTextFieldDelegate
CCTextFieldDelegate中部分代码如下:
class CC_DLL CCTextFieldDelegate
{
public:
/** If the sender doesn't want to attach to the IME, return true;*/
virtual bool onTextFieldAttachWithIME(CCTextFieldTTF * sender)
{
CC_UNUSED_PARAM(sender);
return false;
}
/**If the sender doesn't want to detach from the IME, return true;*/
virtual bool onTextFieldDetachWithIME(CCTextFieldTTF * sender)
{
CC_UNUSED_PARAM(sender);
return false;
}
/**If the sender doesn't want to insert the text, return true;*/
virtual bool onTextFieldInsertText(CCTextFieldTTF * sender, const char * text, int nLen)
{
CC_UNUSED_PARAM(sender);
CC_UNUSED_PARAM(text);
CC_UNUSED_PARAM(nLen);
return false;
}
/**If the sender doesn't want to delete the delText, return true;*/
virtual bool onTextFieldDeleteBackward(CCTextFieldTTF * sender, const char * delText, int nLen)
{
CC_UNUSED_PARAM(sender);
CC_UNUSED_PARAM(delText);
CC_UNUSED_PARAM(nLen);
return false;
}
/**If the sender doesn't want to draw, return true.*/
virtual bool onDraw(CCTextFieldTTF * sender)
{
CC_UNUSED_PARAM(sender);
return false;
}
};
bool onTextFieldAttachWithIME(CCTextFieldTTF * sender):即将激活输入法,如果不想激活,返回true。
bool onTextFieldDetachWithIME(CCTextFieldTTF * sender):即将取消输入法,如果不想取消,返回true。
bool onTextFieldInsertText(CCTextFieldTTF * sender, const char * text, int nLen):即将插入一段文字,如果不想插入,返回true。
bool onTextFieldDeleteBackward(CCTextFieldTTF * sender, const char * delText, int nLen):即将删除一段文字,如果不想删除,返回true。
bool onDraw(CCTextFieldTTF * sender):如果不希望绘制这个输入法,返回true。
实例:使用CCTextFieldDelegate实现通知相关事件
继承CCTextFieldDelegate类后需要覆写以上五个函数,按需要覆写。
首先,继承CCTextFieldDelegate:
class HelloWorld : public cocos2d::CCLayer, public cocos2d::CCTextFieldDelegate
{
public:
static cocos2d::CCScene* scene();
virtual bool init();
CREATE_FUNC(HelloWorld);
bool onTextFieldAttachWithIME(CCTextFieldTTF * sender);
bool onTextFieldDetachWithIME(CCTextFieldTTF * sender);
bool onTextFieldInsertText(CCTextFieldTTF * sender, const char * text, int nLen);
bool onTextFieldDeleteBackward(CCTextFieldTTF * sender, const char * delText, int nLen);
bool onDraw(CCTextFieldTTF * sender);
};
然后,按需要覆写上面五个函数,使用之:
bool HelloWorld::init()
{
CCLayer::init();
CCTextFieldTTF * text = CCTextFieldTTF::textFieldWithPlaceHolder("Please Input", "Arial", 20);
text->setPosition(ccp(200,200));
text->setDelegate(this);//绑定接口
text->attachWithIME();
addChild(text);
return true;
}
bool HelloWorld::onTextFieldAttachWithIME(CCTextFieldTTF * sender)
{
return false;
}
bool HelloWorld::onTextFieldDetachWithIME(CCTextFieldTTF * sender)
{
//将屏幕上移,避免虚拟键盘遮挡输入框
this->setPosition(0, 100);
return false;
}
bool HelloWorld::onTextFieldInsertText(CCTextFieldTTF * sender, const char * text, int nLen)
{
//将屏幕移动会原处
this->setPosition(ccp(0, 0));
return false;
}
bool HelloWorld::onTextFieldDeleteBackward(CCTextFieldTTF * sender, const char * delText, int nLen)
{
return false;
}
bool HelloWorld::onDraw(CCTextFieldTTF * sender)
{
return false;
}
使用CCTextFieldDelegate后,在创建好输入框后,需要把输入框通过setDelegate绑定接口,之后便可以使用。