我先创建一个label
[cpp]view plain copy
- std::string star_str = "star is not star in the sky,it is on heart"; //先定义一个string
- auto m_label = LabelTTF::create(star_str,"Arial",25); //创建一个label
- m_label->setPosition(Point(300,300));
- this->addChild(m_label,2);
【移动开发|cocos2dx之Label实现换行】
文章图片
说到Label如何换行,首先想到的就是设置label的尺寸,让它到了边界时要懂得自己换行 ,添加一行代码:
[cpp]view plain copy
- m_label->setDimensions(Size(200,200)); //设置label的尺寸
文章图片
上面这种方法固然方便,但还是有它的局限性: 假如我们做的是一个类似微信的聊天对话框,这种对话框一个特点就是会随着你文字长度的改变而改变。而如果我们在这里讲Label的尺寸给写死了,那对话框也就跟着失去它的灵活性了。
这里有没有更酷的解决办法么?答案是肯定的。
LabelTTF有一个好处就是会在字符串中有"\n"的地方换行 ,利用这个特点可以写一个自动换行的函数,参考代码如下:
//str是传入的字符串,length是每行的长度
[cpp]view plain copy
- std::string HelloWorld::myWrap(std::string str,int length)
- {
- unsigned int beginPos = 0; //字符串的初始位置
- std::string resultStr; //返回的字符串
- std::vector str_vec; //创建一个字符串类型的顺序容器
- do
- {
- str_vec.push_back(str.substr(beginPos,length)); //substr函数的作用类似剪刀,将str中从beginPos到length之间的字符串剪下来,单独放入容器中
- if (beginPos+length >str.size())
- {
- break; //当要裁剪的长度超出str的长度,则退出循环
- }
- else
- {
- beginPos += length;
- }
- } while (true);
- for (unsigned int i = 0; i
- {
- resultStr.append(str_vec.at(i)).append("\n"); //从容器逐一取出之前裁剪好的一段段字符串,分别在字符串后面加上换行符。append()类似胶水,将\n粘到字符串后面
- }
- //resultStr.pop_back(); //这一句是将最后一个多余的\n给删掉
- return resultStr;
- }
现在用这种方法重写一次label的创建过程
[cpp]view plain copy
- std::string star_str = "star is not star in the sky,it is on heart"; //先定义一个string
- auto m_label = LabelTTF::create(myWrap(star_str,10),"Arial",25); //创建一个label
- m_label->setPosition(Point(300,300));
- this->addChild(m_label,2);
结果如下图所示:
文章图片
恩,就酱紫啦。
尊重原创,转载请注明来源:
http://blog.csdn.net/star530/article/details/22757281
推荐阅读
- 操作系统|[译]从内部了解现代浏览器(1)
- 程序员|DevEcoStudio的及其传感器的使用,闭关在家37天“吃透”这份345页PDF
- 图片加载框架之 ImageLoader
- OKHttp源码分析1 - 框架
- 移动开发|android 录屏方案 VFR和CFR
- 配置Android Studio的缓存文件路径(释放你的C盘)
- android Module之间数据传递
- 移动开发|Android入门(5)最简单的Handler例子
- 移动开发|我在达内学安卓-基于ArrayAdapter创建单一对象列表方式创建联系人列表!
- 移动开发|Android消息传递之EventBus 3.0使用详解