cocos2d-x 输入框 简单实现

//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<int> 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();
};

.cpp中

#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; i<nHeight; ++i) {
		for (int j=0; j<column; ++j) {
			//pixels[i][j] = 0xffffffff;
			pixels[i][j] = 0x00000000;
		}
	}

	//创建光标精灵
	CCTexture2D *texture = new CCTexture2D();
	texture->initWithData(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;i<vec_len.size();i++)
	{
		//CCLog("vec_len[%d]: %d",i,vec_len[i]);
		if (vec_len[i]>1)
		{
			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;i<vec_len.size();i++)
	{
		if (vec_len[i]>1)
		{
			sum = sum + 2;
		}
		else
		{
			sum = sum + 1;
		}
	}

	return sum;
}

大体功能都实现好了。。。



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值