自动调整 TextView

从 Android 8.0(API 级别 26)及更高版本开始,您可以指示 TextView 自动让文本大小根据 TextView 的特征和边界扩展或收缩以填充其布局。此设置使优化不同屏幕上的文本大小变得更加容易,并且内容动态变化。

Support Library 26.0 在运行 Android 版本 8.0(API 级别 26)或更低版本的设备上完全支持自动调整 TextView 功能。 android.support.v4.widget 包包含 TextViewCompat 类,用于以向后兼容的方式访问功能。

设置 TextView 自动调整

您可以使用框架或 Support Library 以编程方式或在 XML 中设置 TextView 的自动调整。要设置 XML 属性,您也可以使用 Android Studio 中的 **属性** 窗口。

有三种方法可以设置 TextView 的自动调整,在以下部分中描述

注意:如果您在 XML 文件中设置自动调整,我们建议不要使用“wrap_content”作为 TextViewlayout_widthlayout_height 属性的值。这样做可能会产生意想不到的结果。

默认

默认设置允许 TextView 的自动调整在水平和垂直轴上均匀缩放。

  • 要以编程方式定义默认设置,请调用 setAutoSizeTextTypeWithDefaults(int autoSizeTextType) 方法。提供 AUTO_SIZE_TEXT_TYPE_NONE 来关闭自动调整功能,或提供 AUTO_SIZE_TEXT_TYPE_UNIFORM 来在水平和垂直轴上均匀缩放。
  • 注意:统一缩放的默认尺寸为 minTextSize = 12spmaxTextSize = 112sp,以及 granularity = 1px.

  • 要在 XML 中定义默认设置,请使用 android 命名空间并将 autoSizeTextType 属性设置为 noneuniform
  • <?xml version="1.0" encoding="utf-8"?>
    <TextView
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:autoSizeTextType="uniform" />
    

使用 Support Library 定义默认设置

  • 要通过 Support Library 以编程方式定义默认设置,请调用 TextViewCompat.setAutoSizeTextTypeWithDefaults(TextView textview, int autoSizeTextType) 方法。提供 TextView 小部件的实例和其中一种文本类型,例如 TextViewCompat.AUTO_SIZE_TEXT_TYPE_NONETextViewCompat.AUTO_SIZE_TEXT_TYPE_UNIFORM
  • 要在 XML 中通过 Support Library 定义默认设置,请使用 app 命名空间并将 autoSizeTextType 属性设置为 noneuniform
  • <?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>
    

粒度

您可以定义最小和最大文本大小的范围以及指定每一步大小的尺寸。 TextView 在最小和最大大小属性之间范围内均匀缩放。每次增量都作为粒度属性中设置的步长大小发生。

使用 Support Library 定义粒度

  • 要通过 Support Library 以编程方式定义文本大小范围和尺寸,请调用 TextViewCompat.setAutoSizeTextTypeUniformWithConfiguration(int autoSizeMinTextSize, int autoSizeMaxTextSize, int autoSizeStepGranularity, int unit) 方法。提供最大值、最小值、粒度值以及任何 TypedValue 尺寸单位。
  • 要在 XML 中通过 Support Library 定义文本大小范围和尺寸,请使用 app 命名空间并在布局 XML 文件中设置 autoSizeTextautoSizeMinTextSizeautoSizeMaxTextSizeautoSizeStepGranularity 属性。
  • <?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>
    

预设大小

预设大小允许您指定 TextView 在自动调整文本时选择的的值。

  • 要使用预设大小以编程方式设置 TextView 的自动调整,请调用 setAutoSizeTextTypeUniformWithPresetSizes(int[] presetSizes, int unit) 方法。提供一个大小数组以及任何 TypedValue 尺寸单位。
  • 要使用预设大小在 XML 中设置 TextView 的自动调整,请使用 android 命名空间并设置以下属性
    • autoSizeTextType 属性设置为 noneuniformnone 值是默认值,而 uniform 允许 TextView 在水平和垂直轴上均匀缩放。
    • autoSizePresetSizes 属性设置为一个预设大小数组。要访问数组作为资源,请在 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" />
    

使用 Support Library 设置预设大小

  • 要通过 Support Library 以编程方式使用预设大小设置 TextView 的自动调整,请调用 TextViewCompat.setAutoSizeTextTypeUniformWithPresetSizes(TextView textView, int[] presetSizes, int unit) 方法。提供 TextView 类的实例、一个大小数组以及任何 TypedValue 尺寸单位。
  • 要在 XML 中通过 Support Library 使用预设大小设置 TextView 的自动调整,请使用 app 命名空间并在布局 XML 文件中设置 autoSizeTextTypeautoSizePresetSizes 属性。
  • <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>
    

其他资源

有关在处理动态内容时自动调整 TextView 的更多信息,请观看 Android Jetpack:自动调整 TextView