//2013-09-14更新\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
我记得我新手的时候,输入框的实现感觉非常困难,也一直用别人写好的输入框,但是最近由于项目的一些要求,
要做些改进。发现之前他们写的代码太乱,很多代码都可以省略,并且有很多bug,如:点击文本框,光标没有出现,并且不能输入,要点到特别的地方,因此,想简单实现一个输入框。
我主要实现的功能:
1): 带光标,参考网上的人写的
2): 密码框
3): 输入框中是否含有中文
4): 还有一些简单的设置最大宽度,得到输入框的值等等;
还是看代码:
.h文件中
#pragma once
#include "cocos2d.h"
USING_NS_CC;
using namespace std;
class NQTextField : public CCTextFieldTTF, public CCTextFieldDelegate, public CCTouchDelegate
{
public:
NQTextField();
~NQTextField();
public:
// static
static NQTextField* textFieldWithPlaceHolder(const char *placeholder, const char *fontName, float fontSize);
// CCLayer
void onEnter();
void onExit();
bool init();
// 初始化光标精灵
void initCursorSprite(int mHeight);
// CCTextFieldDelegate
virtual bool onTextFieldInsertText(CCTextFieldTTF * pSender, const char * text, int nLen);
virtual bool onTextFieldDeleteBackward(CCTextFieldTTF * pSender, const char * delText, int nLen);
// CCLayer Touch
bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);
// 打开输入法
void openIME();
// 关闭输入法
void closeIME();
private:
//光标
CCSprite* m_pCursorSprite;
//字体大小
float fontHeight;
//输入框的宽度
float inputFrameWidth;
//输入框的内容
string *m_pInputText;
//用户写入的placeholder
std::string m_placeholder;
//是否为密码框
bool m_bPassword;
//密码字符串*
std::string str_password;
//存储输入框中字母的字节,用于判断是否为中文
vector vec_len;
//输入字符的最大长度
int m_maxInputWidth;
//字符的计数
int m_inputFlag;
//是否含有非法字符
public:
//设置为密码框
void setPassword( bool isPasswrod = true );
//设置点击区域的宽度 默认宽度200
void setInputFrameWidth( float newWidth );
//设置输入框的内容
void setInputText( std::string newInputText );
//得到输入框的内容
const char* getInputText();
//设置可以输入的最多字符数
void setMaxInputWidth(int newMaxInputWidth);
//判断是否为中文
bool isChinese();
//得到输入框的长度
int getInputWidth();
};
#include "NQTextField.h"
using namespace cocos2d;
using namespace std;
NQTextField::NQTextField(void)
{
CCTextFieldTTF();
}
NQTextField::~NQTextField(void)
{
}
NQTextField* NQTextField::textFieldWithPlaceHolder( const char *placeholder, const char *fontName, float fontSize )
{
NQTextField *pRet = new NQTextField();
if(pRet && pRet->initWithString("", fontName, fontSize))
{
pRet->autorelease();
if (placeholder)
{
pRet->setPlaceHolder(placeholder);
}
pRet->init();
pRet->initCursorSprite(fontSize);
pRet->setHorizontalAlignment(kCCTextAlignmentLeft);
return pRet;
}
CC_SAFE_DELETE(pRet);
return NULL;
}
void NQTextField::onEnter()
{
CCTextFieldTTF::onEnter();
//设置点击代理
CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this,0,false);
this->setDelegate(this);
}
void NQTextField::onExit()
{
CCTextFieldTTF::onExit();
//销毁点击代理
CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);
}
bool NQTextField::init()
{
//必须设置锚点(0,0);
this->setAnchorPoint(CCPointZero);
//输入框宽度
inputFrameWidth = 200;
//初始化
m_pInputText = NULL;
//得到placeholder
m_placeholder = getPlaceHolder();
//不是密码框
m_bPassword = false;
//密码框字符为空
str_password = "";
//最多可以输入字符,默认10
m_maxInputWidth = 30;
//计数默认为0
m_inputFlag = 0;
return true;
}
//初始化光标
void NQTextField::initCursorSprite( int mHeight )
{
const int column = 1;
const int nHeight = (const int)mHeight;
int pixels[50][column];
for (int i=0; iinitWithData(pixels, kCCTexture2DPixelFormat_RGB888, 1, 1, CCSizeMake(column, nHeight));
m_pCursorSprite = CCSprite::createWithTexture(texture);
m_pCursorSprite->setPosition(ccp(0, mHeight / 2));
this->addChild(m_pCursorSprite);
m_pCursorSprite->setVisible(false);
CCActionInterval* m_pCursorAction = CCRepeatForever::create((CCActionInterval *) CCSequence::create(CCFadeOut::create(0.25f), CCFadeIn::create(0.25f), NULL));
m_pCursorSprite->runAction(m_pCursorAction);
//输入字符
m_pInputText = new std::string();
//设置字体高度
fontHeight = mHeight*1.0f;
}
//插入文本
bool NQTextField::onTextFieldInsertText( CCTextFieldTTF * pSender, const char * text, int nLen )
{
//计数超过最大输入字符数,不能插入
if (m_inputFlag > m_maxInputWidth)
{
return true;
}
//屏蔽回车输入
if(text[0] == '\n')
return true;
//存储字节
vec_len.push_back(nLen);
//计数加一
m_inputFlag++;
//输入框总内容添加
m_pInputText->append(text);
//文本框显示字符
setString(m_pInputText->c_str());
//当前字符的长度
float textWidth = getContentSize().width;
//判断是否为密码框
if (m_bPassword)
{
str_password.append("*");
setString(str_password.c_str());
}
//设置光标位置
if (m_pInputText->empty())
{
m_pCursorSprite->setPositionX(0);
}else
{
m_pCursorSprite->setPositionX(getContentSize().width);
}
return true;
}
bool NQTextField::onTextFieldDeleteBackward( CCTextFieldTTF * pSender, const char * delText, int nLen )
{
//将总字符串长度减去nLen字节长
m_pInputText->resize(m_pInputText->size() - vec_len[vec_len.size()-1]);
//存储字节减一
vec_len.resize(vec_len.size()-1);
//计数减一
m_inputFlag--;
//文本框显示字符
setString(m_pInputText->c_str());
//CCLOG("m_pInputText: %s",delText);
//当前字符的长度
float textWidth = getContentSize().width;
//判断是否为密码框
if (m_bPassword)
{
str_password.resize(str_password.size()-1);
setString(str_password.c_str());
}
//设置光标位置
if (m_pInputText->empty())
{
setPlaceHolder("");
m_pCursorSprite->setPositionX(0);
}
else
{
m_pCursorSprite->setPositionX(getContentSize().width);
}
return true;
}
bool NQTextField::ccTouchBegan( CCTouch *pTouch, CCEvent *pEvent )
{
CCPoint touchPoint = convertTouchToNodeSpace(pTouch);
// 判断是打开输入法还是关闭输入法
if (CCRectMake(0, 0, inputFrameWidth, fontHeight).containsPoint(touchPoint))
{
openIME();
}
else
{
closeIME();
}
return true;
}
//打开光标和输入法
void NQTextField::openIME()
{
if (m_pInputText->empty())
{
setPlaceHolder("");
}
m_pCursorSprite->setVisible(true);
this->attachWithIME();
}
//关闭光标和输入法
void NQTextField::closeIME()
{
if (m_pInputText->empty())
{
setPlaceHolder(m_placeholder.c_str());
}
m_pCursorSprite->setVisible(false);
this->detachWithIME();
}
//判断是否为中文
bool NQTextField::isChinese( )
{
for (int i=0;i1)
{
return true;
}
}
return false;
}
//设置密码
void NQTextField::setPassword( bool isPasswrod )
{
m_bPassword = isPasswrod;
}
void NQTextField::setInputFrameWidth( float newWidth )
{
inputFrameWidth = newWidth;
}
void NQTextField::setInputText( std::string newInputText )
{
m_pInputText->append(newInputText.c_str());
}
const char* NQTextField::getInputText()
{
return m_pInputText->c_str();
}
void NQTextField::setMaxInputWidth( int newMaxInputWidth )
{
m_maxInputWidth = newMaxInputWidth;
}
int NQTextField::getInputWidth()
{
int sum = 0;
for (int i=0;i1)
{
sum = sum + 2;
}
else
{
sum = sum + 1;
}
}
return sum;
}