Android 測(cè)量文字寬度的實(shí)例方法
最近在寫 APK 時(shí)遇到了需要獲取文本寬度的需求。其實(shí)就是要自己寫一個(gè)算法以實(shí)現(xiàn)文本超長(zhǎng)自動(dòng)換行的功能。
在實(shí)現(xiàn)這一功能時(shí)發(fā)現(xiàn)了原來在 Android 中測(cè)量文本的長(zhǎng)度,或者說寬度可以分兩種情況:
1、測(cè)量絕對(duì)文本的長(zhǎng)度
2、測(cè)量相對(duì)文本的長(zhǎng)度
首先必須聲明這兩個(gè)概念是筆者自己定義的,因?yàn)槲覍?shí)在找不著更貼切的詞句去形容它們了。
什么是絕對(duì)文本呢?
就是指那些字號(hào)、字體、粗細(xì)等屬性不受在所運(yùn)行的硬件設(shè)備上的 Android 系統(tǒng)的配置所影響文本。例如:自定義View時(shí)通過Canvas繪制出來的文本;
而相對(duì)文本在使用上就廣泛很多了。例如直接用 TextView 展示的文本、網(wǎng)頁上的文本、手機(jī)短信內(nèi)容文本等。相對(duì)文本在字號(hào)、字體、粗細(xì)程度上除了受應(yīng)用開發(fā)時(shí)的配置影響以外還會(huì)間接地受到系統(tǒng)設(shè)置的影響。例如在 Android 的系統(tǒng)設(shè)置 -- 顯示 -- 字體大小 中的配置就會(huì)間接地影響到相對(duì)文本的顯示效果。
這篇博文,就來記錄一下這兩種文本的測(cè)量長(zhǎng)度的方法。
1、絕對(duì)文本長(zhǎng)度的測(cè)量
絕對(duì)文本為了避免被系統(tǒng)配置影響到,通常都不使用 Android 自帶的控件來繪制文本。
比較常見的繪制文本的方式是通過 Canvas 的 drawText() 方法。
絕對(duì)文本的長(zhǎng)度的測(cè)量通常是借助 Paint 來完成的,代碼也很簡(jiǎn)單:
final String txt = "冠狀病毒是自然界廣泛存在的病毒,因該病毒形態(tài)在電鏡下觀察類似王冠而得名。"; Paint paint = new Paint(); paint.setTextSize(15); float length = paint.measureText(txt); Logger.d(TAG, "txt length:" + length);
這種測(cè)量方式得到的結(jié)果值是不隨系統(tǒng)顯示字號(hào)的改變而改變的。
2、相對(duì)文本長(zhǎng)度的測(cè)量
最簡(jiǎn)單的測(cè)量這種隨系統(tǒng)配置而改變屬性的文本的長(zhǎng)度的方法就是借助于 Android 自身控件。這里貼出一種直接用 TextView 控件來測(cè)量的辦法:
final String txt = "冠狀病毒是自然界廣泛存在的病毒,因該病毒形態(tài)在電鏡下觀察類似王冠而得名。"; TextView tv = new TextView(this); tv.setTextSize(16); tv.setText(txt); TextPaint tp = tv.getPaint(); float length = Layout.getDesiredWidth(tv.getText().toString(), 0, tv.getText().length(), tp); Logger.d(TAG, "txt length:" + length); Logger.d(TAG, "screen width:" + ScannerApplication.getInstance().getHardware().getAppWidth()); ((FrameLayout)layout).addView(tv);
這種方法里同樣的字符串內(nèi)容與 TextView 配置,卻可以動(dòng)態(tài)地根據(jù)系統(tǒng)的字體設(shè)置來測(cè)量文本長(zhǎng)度。以下是同一段代碼中在系統(tǒng)設(shè)置中將字體大小分別設(shè)置為小、普通與超大時(shí)的測(cè)量結(jié)果:
系統(tǒng)字體為小號(hào)時(shí)的測(cè)量結(jié)果:
Activity: txt length:720.0 Activity: screen width:720
系統(tǒng)字體為普通時(shí)的測(cè)量結(jié)果:
Activity: txt length:864.0 Activity: screen width:720
系統(tǒng)字體為超大時(shí)的測(cè)量結(jié)果:
Activity: txt length:1116.0 Activity: screen width:720
以上就是 Android 應(yīng)用開發(fā)中關(guān)于文本長(zhǎng)度測(cè)量的兩種方法,各位同學(xué)根據(jù)自己的實(shí)際應(yīng)用場(chǎng)景來選擇使用即可。感謝大家的學(xué)習(xí)和對(duì)腳本之家的支持。
相關(guān)文章
ubuntu 12.10 上 android 編譯環(huán)境搭建的深入解析
本篇文章是對(duì)ubuntu 12.10上android 編譯環(huán)境的搭建進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06Android編程自定義AlertDialog樣式的方法詳解
這篇文章主要介紹了Android編程自定義AlertDialog樣式的方法,結(jié)合實(shí)例形式詳細(xì)分析了Android自定義AlertDialog樣式的具體布局與功能實(shí)現(xiàn)相關(guān)操作技巧,需要的朋友可以參考下2018-02-02詳解如何使用Android Studio 進(jìn)行NDK開發(fā)和調(diào)試
本篇文章主要介紹了詳解如何使用Android Studio 進(jìn)行NDK開發(fā)和調(diào)試,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-12-12Android項(xiàng)目開發(fā) 教你實(shí)現(xiàn)Periscope點(diǎn)贊效果
這篇文章主要為大家分享了Android項(xiàng)目開發(fā),一步一步教你實(shí)現(xiàn)Periscope點(diǎn)贊效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2015-12-12android自定義控件實(shí)現(xiàn)簡(jiǎn)易時(shí)間軸(1)
這篇文章主要為大家詳細(xì)介紹了android自定義控件實(shí)現(xiàn)簡(jiǎn)易時(shí)間軸,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01Android Studio綁定下拉框數(shù)據(jù)詳解
這篇文章主要為大家詳細(xì)介紹了Android Studio綁定下拉框數(shù)據(jù),Android Studio綁定網(wǎng)絡(luò)JSON數(shù)據(jù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10