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

本週的聊技術話題和你們說說如何在Android中實現自適應文本大小顯示。
想象一下,在佈局中,一般顯示文本的區域大小是固定的,可是文本長度並不老是固定的。好比列表中的文章標題、界面下方的按鈕文本等等。
爲了儘量讓這些文字可見,傳統的作法是經過文本長度設置文本大小,或者經過android:ellipsize屬性設置文本省略方式等等。
實際上,從Android O開始,Android API引入了自適應文本大小的簡易實現。它不只能夠用於TextView,對於Button等具備文本顯示的控件一樣適用。經過androidX,還能夠適配到低版本的Android中。
下面,咱們以TextView爲例,來看看如何使用它們吧。java

開啓自適應顯示模式

咱們以Empty Activity方式建立一個新的工程,其中默認包含了只顯示Hello World!文本的TextView控件,咱們爲其加上id,並修改尺寸和默認文本。爲了兼容低版本的Android設備,使用androidX中提供的的AppCompatTextView替代TextView。
完整的佈局文件以下:android

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <androidx.appcompat.widget.AppCompatTextView
        android:id="@+id/activity_main_tv"
        android:layout_width="100dp"
        android:layout_height="20dp"
        android:text="abcdefghijklmno"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

而後,將程序運行起來,能夠看到,文字的顯示僅到字母「n」處就中止了,」o」並無顯示。顯而易見,這是由於文本框的大小限制了文字的顯示。app

下面,咱們來到MainActivity代碼,調用setAutoSizeTextTypeWithDefaults();方法,開啓自適應縮放。ide

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);
}

從新運行後,能夠看到文本被完整地顯示出來了:佈局

對於setAutoSizeTextTypeWithDefaults();方法,咱們能夠傳入的參數值一般有兩個,分別是TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM和TextView.AUTO_SIZE_TEXT_TYPE_NONE。對應開啓自適應文本大小與否。code

自定義文本縮放方式

下面,咱們修改TextView的文本,繼續追加:orm

android:text="abcdefghijklmnopqrstuvwxyz"

再次運行App,咱們發現:不管自適應模式開關與否,都沒法完整地顯示全部文本。這時候,咱們就要對文本大小的自動縮放進行自定義了。xml

設定縮放配置

首先要介紹一種經過設定縮放配置實現自定義縮放的方法。咱們先來看代碼:blog

demoTv.setAutoSizeTextTypeUniformWithConfiguration(4,15,2, TypedValue.COMPLEX_UNIT_SP);

如上代碼所示,setAutoSizeTextTypeUniformWithConfiguration();是實現此種縮放方式的關鍵,它由4個參數構成。ip

  • 4:表示文本縮放的最小值;
  • 20:表示文本縮放的最大值;
  • 2:表示文本縮放的嘗試步長;
  • TypedValue.COMPLEX_UNIT_SP:指定前三個參數使用SP做爲單位。

能夠這樣理解,當文本沒法顯示徹底時,系統將以步長爲單位遞減文本大小設定值,直到文本徹底顯示,或者嘗試值小於給定的文本縮放的最小值。
從新運行App,能夠看到文本已經被完整地顯示出來了。

定義預設值

自定義縮放的第二種方式是經過定義預設值實現。咱們仍是直接看代碼:

demoTv.setAutoSizeTextTypeUniformWithPresetSizes(new int[]{9, 11, 13, 15}, TypedValue.COMPLEX_UNIT_SP);

經過setAutoSizeTextTypeUniformWithPresetSizes();方法定義預設值,須要兩個參數,第一個是預設值的具體數值;第二個則是預設值的單位。
以上面的代碼爲例,在進行文字縮放時,文字大小隻能從9SP,11SP,13SP和15SP這4個值中取。遺憾的是,即便取到9SP,文字依然沒法徹底顯示:

仔細觀察圖中第二行文字,能夠發現文字的下面因爲高度不夠,被截去了一段。

小結

綜上,咱們總共講解了三種文本自動縮放的方式。這三種方式無所謂孰優孰劣,只是使用場景的區別。有了它們,咱們無需本身定義不一樣的文字大小,更無需本身實現文字的自適應縮放了。 最後,特別須要說明:必定要在xml以及java代碼中使用AppCompatTextView控件,除非你的App只支持Android O及以上版本。 此次的分享就到這裏,但願上述內容對你有所幫助。

相關文章
相關標籤/搜索