1. 程式人生 > >【聊技術】在Android中實現自適應文字大小顯示

【聊技術】在Android中實現自適應文字大小顯示

本週的聊技術話題和大家說說如何在Android中實現自適應文字大小顯示。 想象一下,在佈局中,通常顯示文字的區域大小是固定的,但是文字長度並不總是固定的。比如列表中的文章標題、介面下方的按鈕文字等等。 為了儘可能讓這些文字可見,傳統的做法是通過文字長度設定文字大小,或者通過android:ellipsize屬性設定文字省略方式等等。 實際上,從Android O開始,Android API引入了自適應文字大小的簡易實現。它不僅可以用於TextView,對於Button等具有文字顯示的控制元件同樣適用。通過androidX,還可以適配到低版本的Android中。 下面,我們以TextView為例,來看看如何使用它們吧。 # 開啟自適應顯示模式 我們以Empty Activity方式建立一個新的工程,其中預設包含了只顯示Hello World!文字的TextView控制元件,我們為其加上id,並修改尺寸和預設文字。為了相容低版本的Android裝置,使用androidX中提供的的AppCompatTextView替代TextView。 完整的佈局檔案如下: ```xml ``` 然後,將程式執行起來,可以看到,文字的顯示僅到字母“n”處就停止了,”o”並沒有顯示。顯而易見,這是因為文字框的大小限制了文字的顯示。 ![](https://img2020.cnblogs.com/blog/1595922/202012/1595922-20201208102452647-1701573139.png) 下面,我們來到MainActivity程式碼,呼叫setAutoSizeTextTypeWithDefaults();方法,開啟自適應縮放。 ```java private AppCompatTextView demoTv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); demoTv = findViewById(R.id.activity_main_tv); demoTv.setAutoSizeTextTypeWithDefaults(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM); } ``` 重新執行後,可以看到文字被完整地顯示出來了: ![](https://img2020.cnblogs.com/blog/1595922/202012/1595922-20201208102509363-474242431.png) 對於setAutoSizeTextTypeWithDefaults();方法,我們可以傳入的引數值通常有兩個,分別是TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM和TextView.AUTO_SIZE_TEXT_TYPE_NONE。對應開啟自適應文字大小與否。 # 自定義文字縮放方式 下面,我們修改TextView的文字,繼續追加: ```xml android:text="abcdefghijklmnopqrstuvwxyz" ``` 再次執行App,我們發現:無論自適應模式開關與否,都無法完整地顯示所有文字。這時候,我們就要對文字大小的自動縮放進行自定義了。 ## 設定縮放配置 首先要介紹一種通過設定縮放配置實現自定義縮放的方法。我們先來看程式碼: ```java demoTv.setAutoSizeTextTypeUniformWithConfiguration(4,15,2, TypedValue.COMPLEX_UNIT_SP); ``` 如上程式碼所示,setAutoSizeTextTypeUniformWithConfiguration();是實現此種縮放方式的關鍵,它由4個引數構成。 - 4:表示文字縮放的最小值; - 20:表示文字縮放的最大值; - 2:表示文字縮放的嘗試步長; - TypedValue.COMPLEX_UNIT_SP:指定前三個引數使用SP作為單位。 可以這樣理解,當文字無法顯示完全時,系統將以步長為單位遞減文字大小設定值,直到文字完全顯示,或者嘗試值小於給定的文字縮放的最小值。 重新執行App,可以看到文字已經被完整地顯示出來了。 ![](https://img2020.cnblogs.com/blog/1595922/202012/1595922-20201208102429923-687148894.png) ## 定義預設值 自定義縮放的第二種方式是通過定義預設值實現。我們還是直接看程式碼: ```java demoTv.setAutoSizeTextTypeUniformWithPresetSizes(new int[]{9, 11, 13, 15}, TypedValue.COMPLEX_UNIT_SP); ``` 通過setAutoSizeTextTypeUniformWithPresetSizes();方法定義預設值,需要兩個引數,第一個是預設值的具體數值;第二個則是預設值的單位。 以上面的程式碼為例,在進行文字縮放時,文字大小隻能從9SP,11SP,13SP和15SP這4個值中取。遺憾的是,即使取到9SP,文字依然無法完全顯示: ![](https://img2020.cnblogs.com/blog/1595922/202012/1595922-20201208102413407-1427213098.png) 仔細觀察圖中第二行文字,可以發現文字的下面由於高度不夠,被截去了一段。 # 小結 綜上,我們總共講解了三種文字自動縮放的方式。這三種方式無所謂孰優孰劣,只是使用場景的區別。有了它們,我們無需自己定義不同的文字大小,更無需自己實現文字的自適應縮放了。 最後,特別需要說明:一定要在xml以及java程式碼中使用AppCompatTextView控制元件,除非你的App只支援Android O及以上版本。 這次的分享就到這裡,希望上述內容對你有所