RichText的问题一直存在, 我们来分析下RichText的代码吧,
//文本元素的添加
void RichText::handleTextRenderer(const std::string& text, const std::string& fontName, float fontSize, const Color3B &color, GLubyte opacity)
{
auto fileExist = FileUtils::getInstance()->isFileExist(fontName);
Label* textRenderer = nullptr;
if (fileExist)
{
textRenderer = Label::createWithTTF(text, fontName, fontSize);
}
else
{
textRenderer = Label::createWithSystemFont(text, fontName, fontSize);
}
//取到Label控件的长度
float textRendererWidth = textRenderer->getContentSize().width;
_leftSpaceWidth -= textRendererWidth;//leftSpaceWidth richtext控件的长度
if (_leftSpaceWidth < 0.0f)//说明一个文本元素比一行长,要换行了
{
float overstepPercent = (-_leftSpaceWidth) / textRendererWidth;//一行占总文本的长度百分比
std::string curText = text;
size_t stringLength = StringUtils::getCharacterCountInUTF8String(text);//文本的字个数
int leftLength = stringLength * (1.0f - overstepPercent);//一行中占的字的个数,这里就是问题所在
//The minimum cut length is 1, otherwise will cause the infinite loop.
if (0 == leftLength) leftLength = 1;
std::string leftWords = Helper::getSubStringOfUTF8String(curText,0,leftLength);
std::string cutWords = Helper::getSubStringOfUTF8String(curText, leftLength, stringLength - leftLength);
if (leftLength > 0)
{
Label* leftRenderer = nullptr;
if (fileExist)
{
leftRenderer = Label::createWithTTF(Helper::getSubStringOfUTF8String(leftWords, 0, leftLength), fontName, fontSize);
}
int leftLength = stringLength * (1.0f - overstepPercent);//一行中占的字的个数,这里就是问题所在,这里的意思是
(一行长度/文本框长度总长度)*文本总字数 = 一行里应该有几个字数
这个公式成立的条件是每个字占有的宽度一样,但实际中一个 英文,数字,符号,中文的宽度是不一样的,下面是测试代码,大家可以自己测试下看
//////////////////测试富文本
string fontName = "Helvetica";
string strRight = "这周六,一年一度的万dsafdsafd圣节又来啦dfadfsdfdsafqwrew原梓菲q23141234这”个“西方的“鬼节”已经变成一个霍布斯老太太城左影响力流行和受欢迎的节日之一。";
ui::RichText *pRichText = ui::RichText::create();
pRichText->ignoreContentAdaptWithSize(false);
ui::RichElementText* re1 = ui::RichElementText::create(1, Color3B::WHITE, 255, strRight,fontName, 18.0f);
pRichText->setContentSize(Size(600,300));
pRichText->setAnchorPoint(Vec2(0, 0));
pRichText->formatText();
Size sizeText = pRichText->getContentSize();
pRichText->setPosition(Vec2(-pRichText->getContentSize().width/2,0));
pRichText->pushBackElement(re1);
addChild(pRichText);
效果就是这样

如果写得不对请大家指出,按richtext的思路要准确换行要知道每个字符的宽度才行,我的做法是英文数字算0.5*fontsize ,但在有符号“,的情况尾部还是不可能对齐,大家有什么办法解决吗?