8.0开始,在不同尺寸的屏幕上,TextView可以设置autoSizeTextType属性使文字大小填满整个TextView控件。例如下面的一个TextView:
<TextView
android:id="@+id/myview"
android:layout_width="match_parent"
android:layout_height="60dp"
android:text="测试文本"
android:autoSizeTextType="uniform"
android:background="@drawable/shape_rec_stroke"
/>
TextView的宽度是填满屏幕的,而高度则限定在60dp,最终在8.0的设备上显示的是如下效果:
而在7.0设备上显示的如下:
黄色框框即TextView的大小,运行在8.0及更高版本设备上时会文本会自动伸缩到整个控件的大小。这时我们会问,难道我们的控件高度设为200dp,文本也会撑到这么大吗?!其实不是的,如果你只指定了autoSizeTextType一个属性,那么文本大小是有一个默认最小值、默认最大值和一个默认梯度值的:默认最小为12sp,默认最大为112sp,默认梯度为1sp。所以,当控件只指定了autoSizeTextType一个属性时,哪怕我们的控件再大,文本大小最大只会大到112sp。
除了在布局文件中定义这个属性外,我们也可以通过代码实现这个功能:
//minSdkVersion小于26
TextViewCompat.setAutoSizeTextTypeWithDefaults(mMyview,TextViewCompat.AUTO_SIZE_TEXT_TYPE_UNIFORM);
//minSdkVersion为26以上
// mMyview.setAutoSizeTextTypeWithDefaults(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM);
其中的mMyview即我们的目标TextView。
注意:使用autoSizeTextType功能的控件,其高度和宽度最好不要wrap_content,这会引起一些不可预知的结果。
那我们可以更改最大最小值和梯度值么?这是完全可以的,我们先来看看字体大小自适应的其他两种实现方式:
1、指定最大、最小和梯度值
布局文件中实现:
<TextView
android:layout_width="match_parent"
android:layout_height="200dp"
android:autoSizeTextType="uniform"
android:autoSizeMinTextSize="12sp"
android:autoSizeMaxTextSize="100sp"
android:autoSizeStepGranularity="2sp" />
代码实现:
TextViewCompat.setAutoSizeTextTypeUniformWithConfiguration(mMyview,
12,100,2, TypedValue.COMPLEX_UNIT_SP);
//minSdkVersion为26以上
// mMyview.setAutoSizeTextTypeUniformWithConfiguration(12,100,2,TypedValue.COMPLEX_UNIT_SP);
2、预设一组值,不自动递增
首先在res/values/arrays.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" />
代码中实现:
//minSdkVersion小于26
TextViewCompat.setAutoSizeTextTypeUniformWithPresetSizes(mMyview,
new int[]{10,12,20,40,100}, TypedValue.COMPLEX_UNIT_SP);
//minSdkVersion为26以上
// mMyview.setAutoSizeTextTypeUniformWithPresetSizes(new int[]{10,12,20,40,100},
// TypedValue.COMPLEX_UNIT_SP);