这是我参与 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可选两个状态uniform和none,默认值为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);