系統(tǒng)SDK版本大于等于26诱建,直接使用TextView就可以。
系統(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屬性午绳。該屬性取值也有兩個none
和uniform
,對應(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);
}
參考鏈接: