Android TextView 字体自适应

1,554 阅读1分钟

这是我参与 8 月更文挑战的第 19 天,活动详情查看: 8月更文挑战

背景

在开发中偶尔会遇到控件不能换行, 但是又需要把文字显示全的需求, 看到好多的实现都是集成TextView 然后再动态的判断控件宽度和文字宽度进行处理. 本篇介绍使用Google原生方法进行处理

使用

对于Android 8.0及以上的版本, 可以使用android:autoSizeTextType,android:autoSizeMinTextSize,android:autoSizeMaxTextSize>以及android:autoSizeStepGranularity参数进行调整
对于Android8.0以下的设备, 则需要通过android.support.v4.widget下的TextViewCompat 类进行调整

Android 8.0及以上处理方式

autoSizeTextType可选两个状态uniformnone,默认值为none不调整,uniform为系统自动调整

<TextView
    android:layout_width="200dp"
    android:text="测试自动缩小"
    android:layout_height="50dp"
    android:autoSizeTextType="uniform" />

注意:如果您在 XML 文件中设置自动调整大小,则不建议对 TextView 的 layout_width 或 layout_height 属性使用值wrap_content,否则可能会产生意外结果。

  • 设置可缩放的最大值和最小值 autoSizeMinTextSize设置自动缩小的最小值
    autoSizeMaxTextSize设置自动缩小的最大值
<TextView
    android:layout_width="200dp"
    android:text="测试自动缩小"
    android:layout_height="50dp"
    android:autoSizeTextType="uniform"
    android:autoSizeMinTextSize="8sp"
    android:autoSizeMaxTextSize="20sp"
    android:autoSizeStepGranularity="2sp" />

Android 8.0以下处理方式

注意 在Android8.0以下要使用自动缩放功能, 则Activity必须继承AppCompatActivity或者他的子类才可以, 并且这个支持库最低支持Android 4.0

  • 在xml直接设置 在arrays添加array 的资源
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <array name="autosize_text_sizes">
        <item>10sp</item>
        <item>12sp</item>
        <item>20sp</item>
        <item>40sp</item>
        <item>100sp</item>
    </array>
</resources>

在xml文件中通过autoSizePresetSizes进行引用

<TextView
    android:id="@+id/tv_auto"
    android:layout_width="200dp"
    android:text="测试自动缩小"
    app:autoSizeTextType="uniform"
    app:autoSizePresetSizes="@array/autosize_text_sizes"
    android:layout_height="50dp" />
  • 在代码中设置
<TextView
    android:id="@+id/tv_auto"
    android:layout_width="200dp"
    android:text="测试自动缩小"
    android:layout_height="50dp" />

在Ui中继续动态设置

TextViewCompat.setAutoSizeTextTypeWithDefaults(auto,TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM);
TextViewCompat.setAutoSizeTextTypeUniformWithPresetSizes(auto,getResources().getIntArray(R.array.autosize_text_sizes), TypedValue.COMPLEX_UNIT_SP);