1. 程式人生 > >cocos2d-html5 文字自動換行

cocos2d-html5 文字自動換行

提醒:本文最後更新於 2025 天前,文中所描述的資訊可能已發生改變,請謹慎使用。

某次使用 cocos2d-html5 時發現,通過 cc.LabelTTF 顯示的文字即使寬度超過了預設值,也不會自動換行。上網搜了下,很多人都遇到了同樣的問題。

之前用 cocos2d-x 的 CCLabelTTF 沒這個問題。看了下程式碼,在 iOS 平臺上, CCLabelTTF 最終是呼叫 UIStringDrawing 的 drawInRect 函式,而這個函式支援設定 lineBreakMode,也就是換行模式。

接著再看 cocos2d-html5 裡的 CCLabelTTF.js,發現 _updateTTF 這個函式裡其實有換行邏輯,但是隻處理了空格和 \n 換行:如果一行文字太長,會在最近的空格處換行;\n 則是用來強制換行的。這個策略對於英文這種單詞之間有空格的語言來說是夠用,但是對於中文就不合適了。

如果在建立 LabelTTF 時,字串已按照指定寬度插入 \n 強制換行,那最終的展現結果就是我想要的。由於文字包含中文、英文、數字和符號,又很少使用等寬字型。所以要確定指定的寬度能顯示多少字元,除了不斷嘗試沒什麼好辦法。

首先,我們需要獲取指定文字的寬度,可以通過建立一個臨時 LabelTTF 來完成:

function getStrWidth(str, fontName, fontSize) {
    var tmpLabel = cc.LabelTTF.create(str, fontName, fontSize);
    return tmpLabel.getContentSize().width;
}

也可以用 measureText 來實現同樣的功能(下面這個方案在 html5 和 iOS 的 jsb 環境都 OK,在 java 環境下會報錯):

function getStrWidth(str, fontName, fontSize) {
    cc.renderContext.font = fontSize + "px " + fontName;
    return cc.renderContext.measureText(str).width;
}

接著,就可以迴圈插入 \n 了。大概思路是指定一個差不多的初始值 L(可以用指定寬度 width 除以字型大小),截出 0 到 L 位置的字串,用 getStrWidth 計算寬度,如果比我們指定的寬度 width 大,L--,繼續比較;否則 L++ 繼續。直到 L 個字元寬度和我們指定寬度剛好相等(很小的概率),或者 L 個字元長度不夠,但 L+1 長度又多了的情況下,可以確定這一行可以放這 L 個字元。然後繼續處理下一行,直至字串結束。

實際效果和實現見 Demo 和程式碼。理論上,如果中英文混排的時候,應該儘可能避免把英文單詞拆開,這個 Demo 沒處理這種情況。效率方面我測試了下,6000 箇中英文字串以 500px 寬度,16px 字號插入 \n,用第一種方法耗時 10 幾 ms,第二種才幾 ms,基本都可以忽略不計。

--EOF--

提醒:本文最後更新於 2025 天前,文中所描述的資訊可能已發生改變,請謹慎使用。

相關推薦

cocos2d-html5 文字自動

提醒:本文最後更新於 2025 天前,文中所描述的資訊可能已發生改變,請謹慎使用。 某次使用 cocos2d-html5 時發現,通過 cc.LabelTTF 顯示的文字即使寬度超過了預設值,也不會自動換行。上網搜了下,很多人都遇到了同樣的問題。 之前用 cocos2d-x 的 CCLabelTTF

html5-canvas的繪製文字自動

  本文介紹怎麼解決canvas繪圖過程中,drawText的換行問題,先看一個大家平時在canvas繪製文字都會遇到的問題:      一個150*100的canvas畫布,加個邊框明顯邊界 <canvas id="canvas" styl

HTML5 canvas 文字自動

html5 的canvas 提供了多樣性的功能。 在canvas中提供了將文字作為圖片輸出到畫布上的功能,通常用到的函式主要有canvas.drawText 和canvas.fillText兩個。 以canvas.fillText()函式為例,在canvas.fillTex

canvas文字自動、圓角矩形畫法、生成圖片手機長按保存

UNC get 函數 odata -i 圓角 ont eight nehe canvas的文字自動換行函數封裝 // str:要繪制的字符串 // canvas:canvas對象 // initX:繪制字符

JSP中table表格中的文字自動

style="display:inline-block;width:300px;word-wrap:break-word;white-space:normal" <span></span> style樣式+span標籤 <td align="left"

對於span標籤內文字自動的屬性white-space

<span style="white-space: pre-wrap;"> 測試資料 </span> white-space -- 通過HTML文件的原始碼的排版方式控制頁面顯示文字的排版方式  取值: normal | pre | nowrap |

canvas的繪製文字自動 最簡單實現

先看下效果圖: 程式碼如下,後面解釋(小程式為例) content = "canvas的繪製文字自動換行 By Frank"; const ctx = wx.createCanvasContext('canvas'); ctx.setFontSize(1

C++使用Uniscribe進行文字自動的計算和渲染

Uniscribe是Windows 2000以來就存在於WinAPI中的一個庫。這個庫能夠提供給我們關於字串渲染的很多資訊,譬如說哪裡可以換行啦,渲染的時候字元的順序應該是什麼樣子啦,還有每一個字元的大小什麼的。關於Uniscribe的資料可以在http://msdn.microsoft.com/

mxGraph圖形文字自動

兩種方式。 1、直接設定預設樣式 style[mxConstants.STYLE_WHITE_SPACE]='wrap' 2、重寫mxCellRenderer.prototype.createLabel方法,將其中state.text進行更改,原來的程式碼如下

css控制文字自動

自動換行問題,正常字元的換行是比較合理的,而連續的數字和英文字元常常將容器撐大,挺讓人頭疼,下面介紹的是CSS如何實現換行的方法對於div,p等塊級元素正常文字的換行(亞洲文字和非亞洲文字)元素擁有預設的white-space:normal,當定義的寬度之後自動換行html正

WinForm系列——DataGridView單元格文字自動

DataGridView是.NET開發中常用的控制元件,在開發中發現大文字資料顯示時無法在介面上完全顯示,以下是我的解決方法。 (1)首先要保證單元格的為Text型別 (2)在程式中加入以下的程式碼片段 //設定資料來源 this.dataGridView1.

C#: WinForm系列——DataGridView單元格文字自動

DataGridView是.NET開發中常用的控制元件,在開發中發現大文字資料顯示時無法在介面上完全顯示,以下是我的解決方法。 (1)首先要保證單元格的為Text型別 (2)在程式中加入以下的程式碼片段 String str1 = "mac:192.168.0.121"; String str

iOS開發之UIlabel多文字自動自動

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Uniscribe文字自動

我們獲得了每個字形的寬度陣列piAdvances,以及這個RUN所佔用的總寬度abc。 piVdvances對應於每個字元,它取得了每個字形所佔用寬度。 如果我們以行為單位來繪製文字,我們可以以一個迴圈來取得每個RUN的寬度資訊,並一直相加,假設我們己取得了一些run的寬度和,假設這個寬度和為Li

[轉]C#控制元件——DataGridView單元格文字自動

DataGridView是.NET開發中常用的控制元件,在開發中發現大文字資料顯示時無法在介面上完全顯示,以下是我的解決方法。 (1)首先要保證單元格的為Text型別 (2)在程式中加入以下的程式碼片段 //設定資料來源      this.dataGridView1.DataSource = dt;  

CSS解決文字自動

1.單行文字溢位隱藏:p{ text-overflow: ellipsis;//必須 white-space: nowrap;//必須 overflow: hidden;//必須 }2.多行文字溢位隱藏:  (只適用移動端和 chrome)p{word-break: brea

WPF控制元件TextBlock中文字自動

在很多的WPF專案中,往往為了追求介面的美觀,需要控制控制元件中文字的換行顯示,現對TextBlock控制元件換行的實現方式進行總結,希望大家多多拍磚!!! 1.使用轉義字元 在XAML檔案中,實現方式如下: <TextBlock x:Name="textBlock

CDC:DrawText多顯示文字的問題(文字自動)

引數:     hdc:裝置環境控制代碼。     lpString:指向將被寫入的字串的指標,如果引數nCount是C1,則字串必須是以\0結束的。     如果uFormat包含DT_MODIFYSTRING,則函式可為此字串增加4個字元,存放字串的緩衝區必須足夠大,能容納附加的字元。     nCoun

IE7瀏覽器float:left li標籤文字自動

Li標籤Float:left在做網頁側欄的一些tags的時候,是一種很好的選擇。不過在中文字元上,可能會出現一點小問題,先看一張IE7和IE8下的效果圖吧:   看起來的確狠蛋疼,在標準瀏覽器中是不會出現上圖IE7的效果的。先看下程式碼結構 <style>

iReport文字自動設定

1、  選中要自動換行的text框,勾選中屬性面板中的“StretchWith Overflow”屬性 2、  選中該欄位所在行的所有欄位(包括行頭),在“屬性”面板中將“Stretch Type”設定為“Relative to Tallest Object”