Flutter中計算文字的寬度/高度

我們在需求開發(fā)的過程中误褪,往往會有計算文字寬度和高度的要求责鳍,遺憾的是Flutter并沒有提供計算文字寬/高的方法,無意中看到 Magic旭 大神的 Flutter-如何計算文字寬高 一文振坚,通過TextPainter曲線救國來實現(xiàn)文字寬/高的計算薇搁,下面具體的實現(xiàn)代碼:

static Size boundingTextSize(String text, TextStyle style,  {int maxLines = 2^31, double maxWidth = double.infinity}) {
  if (text == null || text.isEmpty) {
    return Size.zero;
  }
  final TextPainter textPainter = TextPainter(
      textDirection: TextDirection.ltr,
      text: TextSpan(text: text, style: style), maxLines: maxLines)
    ..layout(maxWidth: maxWidth);
  return textPainter.size;
}

通過上面的代碼相信大家應(yīng)該已經(jīng)看明白了其中的原理了,這個思路非常巧妙渡八,利用了TextPainter類的layout()方法來計算文字的寬/高啃洋。再深入layout()的源代碼中可以看到最終是由ui.Paragraphlayout()調(diào)用native的方法完成寬度和高度計算的,如下圖:

TextPainter的layout()方法實現(xiàn)

ui.Paragraph的layout()方法實現(xiàn)

既然是由native的方法來計算寬度和高度的屎鳍,因此我們也可以得出宏娄,在不同的平臺上獲取到的字符串寬度和高度是不一樣的。但是同平臺不同的機型的計算結(jié)果是否會有差異呢逮壁?在Magic旭在文章中提到孵坚,在華為手機中遇到計算不準確的問題,需求傳入當(dāng)前的Locale對象才能準確計算窥淆,目前這個問題我還沒有遇到卖宠,希望各位遇到這個問題的同學(xué)在評論區(qū)反饋一下具體的機器型號和系統(tǒng)版本號,兼容華為手機的版本如下:

static Size boundingTextSize(BuildContext context, String text, TextStyle style,  {int maxLines = 2^31, double maxWidth = double.infinity}) {
  if (text == null || text.isEmpty) {
    return Size.zero;
  }
  final TextPainter textPainter = TextPainter(
      textDirection: TextDirection.ltr,
      locale: Localizations.localeOf(context, nullOk: true),
      text: TextSpan(text: text, style: style), maxLines: maxLines)
    ..layout(maxWidth: maxWidth);
  return textPainter.size;
}

兼容版本在上一個版本中增加了傳入Locale對象忧饭,您可能會奇怪扛伍,為什么我不一開始就拿出來這個兼容版本呢,原因在于BuildContext這個參數(shù)會大大限制使用的場景词裤,您可能會在項目中增加了一個GlobalStatic.context這樣的全局變量刺洒,這樣就可以擺脫BuildContext施加的場景限制了,這么做很好吼砂,沒有問題逆航。唯一不足的是限制了方法的移植性,方法粘貼到項目中還需要改造一下才能使用渔肩。因此綜合評估后因俐,我還是決定提供了一個移植性更好,但可能存在不足的方法,交由您來自己決定如何改造女揭。

結(jié)語

再次感謝Magic旭大神帶給我們的解決問題的方案和思路蚤假,最有價值的就是解決問題的思路,下面我們簡單回顧一下Magic旭大神的解題思路:

  1. 思考整個框架中哪里會有用到計算文字寬度和高度的地方吧兔,可以定位到RichTextText等組件磷仰,并從中選取一個閱讀代碼找答案。
  2. RichText組件可以找到TextPainter境蔼,從TextPainterwidthheight變化的地方灶平,僅通過width關(guān)鍵字就可以找到layout()方法
  3. 寫Demo創(chuàng)建TextPainter,調(diào)用layout()方法驗證自己的猜想箍土。

以上解題思路運用的好可以幫助我們解決很多開發(fā)過程中遇到的難題逢享,也是我們成為大神的必經(jīng)之路。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末吴藻,一起剝皮案震驚了整個濱河市瞒爬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌沟堡,老刑警劉巖侧但,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異航罗,居然都是意外死亡禀横,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門粥血,熙熙樓的掌柜王于貴愁眉苦臉地迎上來柏锄,“玉大人,你說我怎么就攤上這事复亏≈和蓿” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵缔御,是天一觀的道長茫舶。 經(jīng)常有香客問我刹淌,道長,這世上最難降的妖魔是什么讥耗? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任有勾,我火速辦了婚禮,結(jié)果婚禮上古程,老公的妹妹穿的比我還像新娘蔼卡。我一直安慰自己,他們只是感情好挣磨,可當(dāng)我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布雇逞。 她就那樣靜靜地躺著荤懂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪塘砸。 梳的紋絲不亂的頭發(fā)上节仿,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天,我揣著相機與錄音掉蔬,去河邊找鬼廊宪。 笑死,一個胖子當(dāng)著我的面吹牛女轿,可吹牛的內(nèi)容都是我干的箭启。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蛉迹,長吁一口氣:“原來是場噩夢啊……” “哼傅寡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起北救,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤荐操,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后扭倾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體淀零,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年膛壹,在試婚紗的時候發(fā)現(xiàn)自己被綠了驾中。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡模聋,死狀恐怖肩民,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情链方,我是刑警寧澤持痰,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布祟蚀,位于F島的核電站工窍,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏前酿。R本人自食惡果不足惜罢维,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望颜阐。 院中可真熱鬧吓肋,春花似錦蓬坡、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至兆龙,卻和暖如春杖爽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背紫皇。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工慰安, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人聪铺。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓化焕,卻偏偏與公主長得像,于是被迫代替她去往敵國和親铃剔。 傳聞我的和親對象是個殘疾皇子撒桨,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容