cocos2dx 获得字符宽度

2015年01月22日 09:57 0 点赞 0 评论 更新于 2025-11-21 15:04

在Cocos2d-x开发中,有时我们需要根据输入的字符串来计算其所需占用的大小(Size)。本文将分享一段封装代码,通过传入字符串即可返回其对应的Size,供大家参考和学习。如果大家发现代码中有问题,欢迎指正交流。

代码实现

以下是封装的代码,该函数会根据输入的字符串计算其所需占用的Size

Size ChartDemoScene::calculateFontSize(const char *str )
{
std::string tempString = str;
log("tempString = %s", tempString.c_str());

// 如果字符串很长,每次抽取100个字符来计算size
size_t computeCount = tempString.size();
Size size = Size(0, 0);

for (int i = 0; i < computeCount; ) {
std::string substring = tempString.substr(i, 1);
// 判断是否为汉字
if ((substring.c_str()[0] & 0x80) != 0) {
// 是汉字,一个汉字占3个字节
substring = tempString.substr(i, 3);
i += 3;
} else {
i++;
}
cclog("substring = %s", substring.c_str());

auto tempLabel = LabelTTF::create(substring.c_str(), "", 25);
tempLabel->setHorizontalAlignment(cocos2d::TextHAlignment::LEFT);
Size tmpLsize = tempLabel->getContentSize();
size.width += tmpLsize.width;
}

float fHeight = 0;
// 判断字符串宽度是否大于容器的宽度
if (size.width > chartWidth) {
// 计算需要多少行
fHeight = (size.width / 200);
}

int nHeight = ceil(fHeight);

if (nHeight == 0) {
nHeight = 1;
}

Size labelSize;
if (size.width < chartWidth) {
// 计算容器的Size
labelSize = Size(size.width, nHeight * 32);
} else {
labelSize = Size(chartWidth, nHeight * 28);
}

// CCLog("labelSize = (%f, %f)", labelSize.width, labelSize.height);
// CCLog("fHeight = %f  nHeight = %d ", fHeight, nHeight);
return labelSize;
}

代码解释

  1. 字符串处理

    • 首先将输入的const char*类型的字符串转换为std::string类型的tempString
    • 遍历tempString,通过判断字符的二进制位来区分汉字和普通字符。汉字通常占3个字节,普通字符占1个字节。
  2. 计算字符宽度

    • 对于每个字符或汉字,创建一个LabelTTF对象,并获取其内容大小tmpLsize
    • 将每个tmpLsize的宽度累加到size.width中。
  3. 计算行数和最终大小

    • 如果size.width大于chartWidth,则计算需要的行数fHeight
    • 使用ceil函数对fHeight向上取整得到nHeight
    • 根据size.widthchartWidth的大小关系,计算最终的labelSize

通过以上步骤,我们可以根据输入的字符串计算出其所需占用的Size