TextView自動調(diào)整字體大小

  1. 系統(tǒng)SDK版本大于等于26诱建,直接使用TextView就可以。

  2. 系統(tǒng)SDK版本小于26,需要使用support包胁塞,support包的版本要大于等于26.0。support包支持Android 4.0 (API level 14)及以上版本压语。
    2.1 如果Activity繼承自AppCompatActivity啸罢,直接使用TextView就可以。
    2.2 否則需要使用AppCompatTextView胎食。

設(shè)置TextView自動調(diào)整字體大小

有三種方式可以設(shè)置TextView支持自動調(diào)整字體大小扰才。

  • 默認(rèn)設(shè)置
  • 控制調(diào)整范圍
  • 預(yù)設(shè)大小

注意:如果在XML文件中設(shè)置自動調(diào)整字體大小,不建議將TextView的寬高設(shè)置為wrap_content厕怜,不然可能會有意想不到的問題衩匣。

默認(rèn)設(shè)置

默認(rèn)設(shè)置允許TextView在水平和垂直軸上均勻調(diào)整字體大小。

在代碼中使用

根據(jù)SDK版本調(diào)用不同的方法

//SDK版本大于等于26
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    tvDynamicSet.setAutoSizeTextTypeWithDefaults(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM)
} else {
    TextViewCompat.setAutoSizeTextTypeWithDefaults(tvDynamicSet,
            TextViewCompat.AUTO_SIZE_TEXT_TYPE_UNIFORM
    )
}

注意:默認(rèn)情況下縮放的最小字體是12sp酣倾,最大的字體是112sp舵揭,每次增加或減少的粒度是1px。

在xml文件中使用

如果系統(tǒng)SDK版本大于等于26躁锡,使用android命名空間并設(shè)置autoSizeTextType屬性午绳。該屬性取值也有兩個noneuniform,對應(yīng)代碼中的兩個值映之。

<TextView
    android:layout_width="match_parent"
    android:layout_height="200dp"
    android:autoSizeTextType="uniform" />

如果系統(tǒng)SDK版本小于26拦焚,因為我們的Activity是繼承自AppCompatActivity的,所以我們可以直接使用TextView杠输,但是注意要使用app命名空間赎败。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

  <TextView
      android:layout_width="match_parent"
      android:layout_height="200dp"
      app:autoSizeTextType="uniform" />

</LinearLayout>

控制調(diào)整范圍

你可以定義字體大小調(diào)整的一個范圍并指定一個漸變值表示每次增加或減少的值。

在代碼中使用

//sdk版本大于等于26
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    tvDynamicSet.setAutoSizeTextTypeUniformWithConfiguration(16, 40, 1, TypedValue.COMPLEX_UNIT_SP
    )
} else {
    TextViewCompat.setAutoSizeTextTypeUniformWithConfiguration(
                    tvDynamicSet, 16, 40, 1, TypedValue.COMPLEX_UNIT_SP
   )
}

以TextView的setAutoSizeTextTypeUniformWithConfiguration方法為例蠢甲,3個參數(shù)的含義如下:

/**
 *
 * @param autoSizeMinTextSize 最小字體
 * @param autoSizeMaxTextSize 最大字體
 * @param autoSizeStepGranularity 漸變值
 * @param unit the 尺寸單位 px僵刮,sp,dp
 */

在xml中使用

如果系統(tǒng)SDK版本大于等于26,使用android命名空間并設(shè)置autoSizeTextType屬性為uniform搞糕。然后設(shè)置autoSizeMinTextSize勇吊,autoSizeMaxTextSize和autoSizeStepGranularity這個三個屬性。

<TextView
    android:layout_width="match_parent"
    android:layout_height="200dp"
    android:autoSizeTextType="uniform"
    android:autoSizeMinTextSize="12sp"
    android:autoSizeMaxTextSize="100sp"
    android:autoSizeStepGranularity="2sp" />

如果系統(tǒng)SDK版本小于26窍仰,使用app命名空間并設(shè)置autoSizeTextType屬性為uniform汉规。然后設(shè)置autoSizeMinTextSize,autoSizeMaxTextSize和autoSizeStepGranularity這個三個屬性驹吮。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

  <TextView
      android:layout_width="match_parent"
      android:layout_height="200dp"
      app:autoSizeTextType="uniform"
      app:autoSizeMinTextSize="12sp"
      app:autoSizeMaxTextSize="100sp"
      app:autoSizeStepGranularity="2sp" />

</LinearLayout>

預(yù)設(shè)大小

你可以指定TextView在自動調(diào)整字體大小的時候所有可取的值针史。

在代碼中使用

//獲取預(yù)設(shè)的字體大小數(shù)字
val intArray = resources.getIntArray(R.array.autosize_text_sizes)
//sdk版本大于等于26
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    tvDynamicSet.setAutoSizeTextTypeUniformWithPresetSizes(intArray, TypedValue.COMPLEX_UNIT_SP
    )
} else {
    TextViewCompat.setAutoSizeTextTypeUniformWithPresetSizes(
            tvDynamicSet, intArray, TypedValue.COMPLEX_UNIT_SP
    )
}

在xml中使用

如果系統(tǒng)SDK版本大于等于26,使用android命名空間碟狞。設(shè)置autoSizeTextType屬性和autoSizePresetSizes屬性啄枕。

<TextView
    android:layout_width="match_parent"
    android:layout_height="200dp"
    android:autoSizeTextType="uniform"
    android:autoSizePresetSizes="@array/autosize_text_sizes" />

res/values/arrays.xml文件中定義需要的數(shù)組。

<resources>
  <array name="autosize_text_sizes">
    <item>10sp</item>
    <item>12sp</item>
    <item>20sp</item>
    <item>40sp</item>
    <item>100sp</item>
  </array>
</resources>

如果系統(tǒng)SDK版本小于26族沃,使用app命名空間并設(shè)置autoSizeTextType屬性和autoSizePresetSizes屬性射亏。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

  <TextView
      android:layout_width="match_parent"
      android:layout_height="200dp"
      app:autoSizeTextType="uniform"
      app:autoSizePresetSizes="@array/autosize_text_sizes" />
</LinearLayout>

PS:監(jiān)聽用戶是否調(diào)整了字體大小

可以在Application的重寫onConfigurationChanged方法,然后看fontScale是否改變竭业。標(biāo)準(zhǔn)值是1f。大于1f表示用戶調(diào)大了字體及舍。

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    Logger.d(TAG, "fontScale = " + newConfig.fontScale);
}

參考鏈接:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末未辆,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子锯玛,更是在濱河造成了極大的恐慌咐柜,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件攘残,死亡現(xiàn)場離奇詭異拙友,居然都是意外死亡,警方通過查閱死者的電腦和手機歼郭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進店門遗契,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人病曾,你說我怎么就攤上這事牍蜂。” “怎么了泰涂?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵鲫竞,是天一觀的道長。 經(jīng)常有香客問我逼蒙,道長从绘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮僵井,結(jié)果婚禮上陕截,老公的妹妹穿的比我還像新娘。我一直安慰自己驹沿,他們只是感情好艘策,可當(dāng)我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著渊季,像睡著了一般朋蔫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上却汉,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天驯妄,我揣著相機與錄音,去河邊找鬼合砂。 笑死青扔,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的翩伪。 我是一名探鬼主播微猖,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼缘屹!你這毒婦竟也來了凛剥?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤轻姿,失蹤者是張志新(化名)和其女友劉穎犁珠,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體互亮,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡犁享,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了豹休。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片炊昆。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖慕爬,靈堂內(nèi)的尸體忽然破棺而出窑眯,到底是詐尸還是另有隱情,我是刑警寧澤医窿,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布磅甩,位于F島的核電站,受9級特大地震影響姥卢,放射性物質(zhì)發(fā)生泄漏卷要。R本人自食惡果不足惜渣聚,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望僧叉。 院中可真熱鬧奕枝,春花似錦、人聲如沸瓶堕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽郎笆。三九已至谭梗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間宛蚓,已是汗流浹背激捏。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留凄吏,地道東北人远舅。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像痕钢,于是被迫代替她去往敵國和親图柏。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,724評論 2 351