Android TextView 根据宽度自适应字体大小

2022-07-29  本文已影响0人  逃离_102

说明

在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()方法。

就说到这了,有什么不对的地方,欢迎指正,有什么没说全的,欢迎讨论留言

上一篇 下一篇

猜你喜欢

热点阅读