2016年5月6日 星期五

0506 label 換行

http://blog.csdn.net/star530/article/details/22757281
好了,這次又把Label這貨拉出來鞭一鞭。
我先創建一個label
[cpp] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. std::string star_str = "star is not star in the sky,it is on heart";//先定義一個string  
  2.   
  3. auto m_label = LabelTTF::create(star_str,"Arial",25);//創建一個label  
  4. m_label->setPosition(Point(300,300));  
  5. this->addChild(m_label,2);  
如下圖所示,labelTTF是不會自動換行的,那要實現換行該怎麼做呢?
說到Label如何換行,首先想到的就是設置label的尺寸,讓它到了邊界時要懂得自己換行,添加一行代碼:
[cpp] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. m_label->setDimensions(Size(200,200));//設置label的尺寸  
注意這裡使用的不是setContentSize();運行結果如下圖


上面這種方法固然方便,但還是有它的侷限性:假如我們做的是一個類似微信的聊天對話框,這種對話框一個特點就是會隨著你文字長度的改變而改變。而如果我們在這裡講Label的尺寸給寫死了,那對話框也就跟著失去它的靈活性了。
這裡有沒有更酷的解決辦法麼?答案是肯定的。
LabelTTF有一個好處就是會在字符串中有"\n"的地方換行,利用這個特點可以寫一個自動換行的函數,參考代碼如下:
//str是傳入的字符串,length是每行的長度
[cpp] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. std::string HelloWorld::myWrap(std::string str,int length)  
  2. {  
  3.     unsigned int beginPos = 0;  //字符串的初始位置  
  4.     std::string resultStr;      //返回的字符串  
  5.   
  6.   
  7.     std::vector<std::string > str_vec;  //創建一個字符串類型的順序容器  
  8.     do     
  9.     {    
  10.         str_vec.push_back(str.substr(beginPos,length)); //substr函數的作用類似剪刀,將str中從beginPos到length之間的字符串剪下來,單獨放入容器中   
  11.         if (beginPos+length >str.size())    
  12.         {    
  13.             break;  //當要裁剪的長度超出str的長度,則退出循環  
  14.         }    
  15.         else    
  16.         {    
  17.             beginPos += length;   
  18.         }    
  19.             
  20.     } while (true);    
  21.    
  22.     for (unsigned int i = 0;i<str_vec.size();++i)    
  23.     {    
  24.         resultStr.append(str_vec.at(i)).append("\n"); //從容器逐一取出之前裁剪好的一段段字符串,分別在字符串後面加上換行符。append()類似膠水,將\n粘到字符串後面   
  25.     }    
  26.   
  27.   
  28.  //   resultStr.pop_back();  //這一句是將最後一個多餘的\n給刪掉  
  29.   
  30.   
  31.     return resultStr;    
  32. }  

現在用這種方法重寫一次label的創建過程
[cpp] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. std::string star_str = "star is not star in the sky,it is on heart";//先定義一個string  
  2.   
  3. auto m_label = LabelTTF::create(myWrap(star_str,10),"Arial",25);//創建一個label  
  4. m_label->setPosition(Point(300,300));  
  5. this->addChild(m_label,2);  

結果如下圖所示:
恩,就醬紫啦。
尊重原創,轉載請註明來源:


http://shahdza.blog.51cto.com/2410787/1560612

原文還有更多功能 這邊僅僅節錄換行

【自動換行】
    在3.x中,自動換行有兩種方式。(當然你也可以使用C++裡的轉移字符'\n'進行手動換行)
    > 利用lb->setLineBreakWithoutSpace(true),來支持自動換行功能。
    > 1. 利用 setMaxLineWidth(maxLineWidth),來控制自動換行。
    > 2. 利用 setDimensions(width , height),來控制自動換行。

1、利用setMaxLineWidth
    設置每行顯示文字的最大寬度。
    註:這種方法僅在Label width == 0的情況下,才會有效。
    使用方法:
1
2
3
4
//
    lb->setLineBreakWithoutSpace(true);
    lb->setMaxLineWidth(120); //最大寬度120
//
    如圖:
wKioL1QvuCbx2CuJAACnIfYPH8o016.jpg

2、利用setDimensions
    使用方法:
1
2
3
4
5
//
    lb->setLineBreakWithoutSpace(true);
    lb->setWidth(80);         //設置Label尺寸寬80
    lb->setMaxLineWidth(120); //設置了Label width,這個就無效了
//
    如圖:
wKiom1QvuAKSA95FAAConOTfXF0856.jpg



【文字間距】
    間距的調整,是在 v3.2 之後才出現的。可以設置文本內容的行間距與文字間距。
    註:不支持System Font。
    > setLineHeight        : 設置行間距
    > setAdditionalKerning : 設置額外文字間距

    使用舉例:
1
2
3
4
//
    lb->setLineHeight(80);
    lb->setAdditionalKerning(10);
//
    圖解:
wKiom1QvvLuCSN8WAADoNwsARbo883.jpg

沒有留言:

張貼留言

cocos2dx-lua 建立滑鼠監聽

重要關鍵字  EVENT_MOUSE_SCROLL addEventListenerWithSceneGraphPriority      if IsPc() then --建立滑鼠監聽         local listener = cc.EventListenerMouse...