Android TextView Autosizing 字号自动调整大小,字号自适应

什么是Autosizeng呢,简单说就是TextView文本内容的字号大小是会根据内容多少而变大或者变小以适应布局,尽可能让TextView显示所有的文本内容。

比如TextView控件的宽高是固定的,在内容越少的情况下,为了内容填充整个控件,字号就会变大,在内容越多的情况下,为了显示更多的内容,字号就会缩小。如下图所示:

在Android 8.0(API级别26)及更高版本中,可以直接使用Autosizeng,如果想在低版本中使用,可以使用Support V4包中的TextViewCompat,可以向下兼容到Android 4.0(API级别14)

实现Autosizing功能可以在代码中设置也可以在XML中设置属性。

有三种方法可以设置Autosizing

  • 默认设置
  • 设置变化范围及粒度
  • 预设可选值
    我们下面分别详细介绍

如果要达到Autosizing的效果,建议不要为layout_width和layout_height属性设置wrap_content的值,而是要设置一个固定的值,否则可能达不到你要的效果

使用默认设置

默认设置我们不用设置Autosizing TextView字号的最小值和最大值,默认minTextSize = 12sp, maxTextSize = 112sp以及 granularity = 1px,granularity表示粒度,就是每次递增或减小的大小。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 开启Autosizing
mTextView.setAutoSizeTextTypeWithDefaults(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM);
// 关闭Autosizing
mTextView.setAutoSizeTextTypeWithDefaults(TextView.AUTO_SIZE_TEXT_TYPE_NONE);

<!--开启Autosizing-->
<TextView
android:layout_width="match_parent"
android:layout_height="200dp"
android:autoSizeTextType="uniform" />

<!--关闭Autosizing-->
<TextView
android:layout_width="match_parent"
android:layout_height="200dp"
android:autoSizeTextType="none" />

以上只实适用Android 8.0及以上版本中,如果要兼容低版本,需使用Support包,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 开启Autosizing
TextViewCompat.setAutoSizeTextTypeWithDefaults(mTextView, TextViewCompat.AUTO_SIZE_TEXT_TYPE_UNIFORM);
// 关闭Autosizing
TextViewCompat.setAutoSizeTextTypeWithDefaults(mTextView, TextViewCompat.AUTO_SIZE_TEXT_TYPE_NONE);

<!--开启Autosizing-->
<TextView
android:layout_width="match_parent"
android:layout_height="200dp"
app:autoSizeTextType="uniform" />

<!--关闭Autosizing-->
<TextView
android:layout_width="match_parent"
android:layout_height="200dp"
app:autoSizeTextType="none" />

设置变化范围及粒度

默认值可能不满足我们的要求,那我们可以自定义变化的区间,设置一个最大值和最小值,还有变化的粒度。

在Android 8.0及更高版本中使用如下

1
2
3
4
5
6
7
8
9
10
11
12
// 在代码中设置
mTextView.setAutoSizeTextTypeUniformWithConfiguration(8, 22, TypedValue.COMPLEX_UNIT_SP);

// 在XML中设置
<?xml version="1.0" encoding="utf-8"?>
<TextView
android:layout_width="match_parent"
android:layout_height="200dp"
android:autoSizeTextType="uniform"
android:autoSizeMinTextSize="12sp"
android:autoSizeMaxTextSize="100sp"
android:autoSizeStepGranularity="2sp" />

support包的使用如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 在代码中设置
TextViewCompat.setAutoSizeTextTypeWithDefaults(mTextView, TextViewCompat.AUTO_SIZE_TEXT_TYPE_NONE);

// 在XML中设置
<?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>

预设可选值

你也可以指定一些字号,Autosizing缩放时只会在这几种字号里变化。

在Android 8.0及更高版本中使用如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 在代码中设置
mTextView.setAutoSizeTextTypeUniformWithPresetSizes(new int[]{8, 10, 16, 25}, TypedValue.COMPLEX_UNIT_SP);

// 在XML中设置
<resources>
<array name="autosize_text_sizes">
<item>10sp</item>
<item>12sp</item>
<item>20sp</item>
<item>40sp</item>
<item>100sp</item>
</array>
</resources>

<?xml version="1.0" encoding="utf-8"?>
<TextView
android:layout_width="match_parent"
android:layout_height="200dp"
android:autoSizeTextType="uniform"
android:autoSizePresetSizes="@array/autosize_text_sizes" />

support包设置预设可选值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// 在代码中设置
TextViewCompat.setAutoSizeTextTypeUniformWithPresetSizes(mTextView, new int[]{8, 10, 16, 25}, TypedValue.COMPLEX_UNIT_SP);

// 在XML中设置
<resources>
<array name="autosize_text_sizes">
<item>10sp</item>
<item>12sp</item>
<item>20sp</item>
<item>40sp</item>
<item>100sp</item>
</array>
</resources>

<?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>

参考

如果喜欢我的文章可以关注下我的公号,里面有很多干货哦