说明
在Android开发中部分场景UI会要求根据宽度自适应字体大小的需求,下面就简单来说明一下怎么实现。
autoSizeTextType属性
在Android 8.0 (API level 26)以上,Android提供了autoSizeTextType属性,不过通过万能的拓展库中的AppCompatTextView可以最低支持到Android 4.0(API Level 14)及以上的系统(不过你的应用编译的targetSDKVersion必须在26及以上)。所以现在可以用这个属性直接实现,在之前是需用自定义Textview去实现的,既然有了就不再去解释之前的用法了。既要使用autoSizeTextType属性,又要实现兼容,注意使用AppCompatTextView代替TextView
autoSizeTextType参数介绍:none: 关闭自动调整功能;uniform: 均匀缩放水平轴和垂直轴
示例1
//布局文件中直接使用
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tx2"
android:layout_width="match_parent"
android:layout_height="50dp"
android:text="发发呆几个丰富"
android:maxLines="1"
android:ellipsize="end"
app:autoSizeTextType="uniform"
app:autoSizeMaxTextSize="50sp"
app:autoSizeMinTextSize="4sp"
app:autoSizeStepGranularity="1sp"
android:gravity="center_vertical"/>
//代码中使用
binding.tx2.text = "就发发发发达"
binding.tx2.setAutoSizeTextTypeWithDefaults(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM)
binding.tx2.setAutoSizeTextTypeUniformWithConfiguration(1,200,1,TypedValue.COMPLEX_UNIT_DIP)
布局文件中参数介绍:
autoSizeMaxTextSize:最大值;
autoSizeMinTextSize:最小值;
autoSizeStepGranularity:粒度值,即每次增量或减量的值(允许TextView在MinTextSize-MaxTextSize之间按StepGranularity的值为增量或减量来跳动);
autoSizeTextType:none: 关闭自动调整功能;uniform: 均匀缩放水平轴和垂直轴;
默认设置:
1,粒度xml设置时必须设置autoSizeTextType="uniform",代码设置setAutoSizeTextTypeUniformWithConfiguration时则已设置;
2,默认设置其实minTextSize = 12sp、maxTextSize = 112sp、granularity = 1px的粒度设置;
示例2:
<array name="auto_size_text_sizes">
<item>10sp</item>
<item>15sp</item>
<item>20sp</item>
<item>40sp</item>
<item>100sp</item>
</array>
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tx2"
android:layout_width="match_parent"
android:layout_height="50dp"
android:text="发发呆几个丰富fafasfasdfasdfasdfadsffghffhgfhgfhgfhgf"
android:maxLines="1"
android:ellipsize="end"
app:autoSizeTextType="uniform"
app:autoSizePresetSizes="@array/auto_size_text_sizes"
android:gravity="center_vertical"
tools:ignore="MissingConstraints" />
//代码中设置
binding.tx1.text = "就发发发发达的飞洒发是发送到发"
val presetSizes = intArrayOf(10,15,20,25,30)
binding.tx1.setAutoSizeTextTypeUniformWithPresetSizes(presetSizes,TypedValue.COMPLEX_UNIT_SP)
预设大小,根据给的值自动调整字体大小,不连续,autoSizePresetSizes:预设大小的数组,建议放到res/values/arrays.xml文件里。
总结
还有2点需注意:
1:要设置android:maxLines="n",n可以是任意值,不一定是1,目的就是让其发挥作用,不能用android:singleLine="true";
2:该功能只针对已经存在的TextView的text有效,如果你setText()或append()后改变了text,则改变后不会自适应;因此在调用setText()或append()后,要重新通过代码调用TextViewCompat.setAutoSizeTextTypeUniformWithConfiguration()方法。