#include"CursorTextField.h"
CursorTextField::CursorTextField()
{
m_textField = NULL;
m_cursorSprite = NULL;
m_cursorAction = NULL;
}
Node * CursorTextField::createWithTextField(TextField *text, const std::string &TTFpath, int fontSize)
{
auto ref = new CursorTextField;
if (ref &&ref->init(text, TTFpath, fontSize))
{
ref->autorelease();
}
else CC_SAFE_DELETE(ref);
return ref;
}
bool CursorTextField::init(TextField *text, const std::string &TTFpath, int fontSize)
{
initTextField(text, TTFpath, fontSize);
addCursorSprite();
m_textField->addEventListener(CC_CALLBACK_2(CursorTextField::textFiledEvent,this));
return true;
}
void CursorTextField::initTextField(TextField *text, const std::string &TTFpath, int fontSize)
{
m_textField = text;
m_ttfPath = TTFpath;
m_FontSize = fontSize;
}
int CursorTextField::getContentWidth()
{
auto label = Label::createWithTTF(m_textField->getString(), m_ttfPath, m_FontSize);
auto width = label->getContentSize().width;
int endWidth = m_textField->getPosition().x - m_textField->getContentSize().width / 2 + width + 2;
return endWidth;
}
void CursorTextField::textFiledEvent(Ref *pSender, TextField::EventType type)
{
switch (type)
{
case TextField::EventType::ATTACH_WITH_IME:
{
m_cursorSprite->setVisible(true);
m_cursorSprite->setPositionX(getContentWidth());
break;
}
case TextField::EventType::DETACH_WITH_IME:
m_cursorSprite->setVisible(false);
break;
case TextField::EventType::INSERT_TEXT:
{
m_cursorSprite->setVisible(true);
m_cursorSprite->setPositionX(getContentWidth());
break;
}
case TextField::EventType::DELETE_BACKWARD:
{
m_cursorSprite->setVisible(true);
m_cursorSprite->setPositionX(getContentWidth());
break;
}
default:
break;
}
}
void CursorTextField::addCursorSprite()
{
int column = 2;
int height = m_textField->getFontSize();
int pData[50][2];
for (int i = 0; i < height; i++)
{
for (int j = 0; j < column; j++)
{
pData[i][j] = 0x00000000;
}
}
Texture2D* texture = new Texture2D();
texture->initWithData(pData, 20, Texture2D::PixelFormat::RGB888, 1, height, Size(column, height));
m_cursorSprite = Sprite::createWithTexture(texture);
m_cursorSprite->setPositionY(m_textField->Node::getPositionY());
texture->autorelease();
addChild(m_cursorSprite);
m_cursorSprite->setVisible(false);
m_cursorAction = RepeatForever::create(Sequence::create(FadeOut::create(0.5f), FadeIn::create(0.5f),NULL));
m_cursorSprite->runAction(m_cursorAction);
}
调用
TextField * accountTF = (TextField *)UINode::seekNodeByName(rootNode, "AccountTF");
Node * accountTF_L = CursorTextField::createWithTextField(accountTF, "LuoLi.TTC", accountTF->getFontSize());
accountTF->getParent()->addChild(accountTF_L);