1. 程式人生 > 程式設計 >Android 測量文字寬度的例項方法

Android 測量文字寬度的例項方法

最近在寫 APK 時遇到了需要獲取文字寬度的需求。其實就是要自己寫一個演算法以實現文字超長自動換行的功能。

在實現這一功能時發現了原來在 Android 中測量文字的長度,或者說寬度可以分兩種情況:

1、測量絕對文字的長度

2、測量相對文字的長度

首先必須宣告這兩個概念是筆者自己定義的,因為我實在找不著更貼切的詞句去形容它們了。

什麼是絕對文字呢?

就是指那些字號、字型、粗細等屬性不受在所執行的硬體裝置上的 Android 系統的配置所影響文字。例如:自定義View時通過Canvas繪製出來的文字;

而相對文字在使用上就廣泛很多了。例如直接用 TextView 展示的文字、網頁上的文字、手機簡訊內容文字等。相對文字在字號、字型、粗細程度上除了受應用開發時的配置影響以外還會間接地受到系統設定的影響。例如在 Android 的系統設定 -- 顯示 -- 字型大小 中的配置就會間接地影響到相對文字的顯示效果。

這篇博文,就來記錄一下這兩種文字的測量長度的方法。

1、絕對文字長度的測量

絕對文字為了避免被系統配置影響到,通常都不使用 Android 自帶的控制元件來繪製文字。

比較常見的繪製文字的方式是通過 Canvas 的 drawText() 方法。

絕對文字的長度的測量通常是藉助 Paint 來完成的,程式碼也很簡單:

final String txt = "冠狀病毒是自然界廣泛存在的病毒,因該病毒形態在電鏡下觀察類似王冠而得名。";
Paint paint = new Paint();
paint.setTextSize(15);
float length = paint.measureText(txt);
Logger.d(TAG,"txt length:" + length);

這種測量方式得到的結果值是不隨系統顯示字號的改變而改變的。

2、相對文字長度的測量

最簡單的測量這種隨系統配置而改變屬性的文字的長度的方法就是藉助於 Android 自身控制元件。這裡貼出一種直接用 TextView 控制元件來測量的辦法:

final String txt = "冠狀病毒是自然界廣泛存在的病毒,因該病毒形態在電鏡下觀察類似王冠而得名。";
TextView tv = new TextView(this);
tv.setTextSize(16);
tv.setText(txt);
TextPaint tp = tv.getPaint();
float length = Layout.getDesiredWidth(tv.getText().toString(),tv.getText().length(),tp);
Logger.d(TAG,"txt length:" + length);
Logger.d(TAG,"screen width:" + ScannerApplication.getInstance().getHardware().getAppWidth());
((FrameLayout)layout).addView(tv);

這種方法裡同樣的字串內容與 TextView 配置,卻可以動態地根據系統的字型設定來測量文字長度。以下是同一段程式碼中在系統設定中將字型大小分別設定為小、普通與超大時的測量結果:

系統字型為小號時的測量結果:

Activity: txt length:720.0
Activity: screen width:720

Android 測量文字寬度的例項方法

系統字型為普通時的測量結果:

Activity: txt length:864.0
Activity: screen width:720

Android 測量文字寬度的例項方法

系統字型為超大時的測量結果:

Activity: txt length:1116.0
Activity: screen width:720

Android 測量文字寬度的例項方法

以上就是 Android 應用開發中關於文字長度測量的兩種方法,各位同學根據自己的實際應用場景來選擇使用即可。感謝大家的學習和對我們的支援。