一、什么是AutoSizeing?
AutoSizeing是Android8.0新增的一个TextView的属性,并在Support V26上做了兼容,最低兼容到Android 14。它的作用就是:在指定大小的TextView上,根据文本内容动态的修改TextSize的大小,让TextView能展示更多的内容。以前的通用做法就是,设置属性让其末尾展示...。
二、如何使用AutoSizeing
2.1、不同的使用方式
前面也提到,使用 Autosizeing 其实是区分使用 Android Api Level 26(8.0) 和 使用 Support Library v26 两种。它们的使用方式,会略微有点区别。
2.1.1、Android 8.0上的使用
- 1.动态编码方式
/**
*TextView.AUTO_SIZE_TEXT_TYPE_NONE 关闭AutoSizeing 默认为关闭
* TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM 开启AutoSizeing
*/
textView.setAutoSizeTextTypeWithDefaults(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM);
- 2.layout-xml属性是使用 android:命名空间下的属性设置的
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:autoSizeTextType="uniform"
android:textSize="20sp" />
2.1.2、低于Android8.0使用Support V26
- 1、动态编码使用TextViewCompat中的方法,其内部做了适配处理
TextViewCompat.setAutoSizeTextTypeWithDefaults(textView,TextViewCompat.AUTO_SIZE_TEXT_TYPE_UNIFORM);
- 2、layout-xml布局属性,需要使用 app: 命名空间下的属性,记住要添加 xmlns:app="http://schemas.android.com/apk/res-auto" 这个命名空间。
<TextView
android:layout_width="match_parent"
android:layout_height="200dp"
app:autoSizeTextType="uniform" />
2.2、AutoSizeing的功能
2.2.1、开关
我们可以通过设置autoSizeTextType属性,来控制功能的开关。对于动态编码,可以使用TextViewCompat 的 setAutoSizeTextTypeWithDefaults() 方法:
public static void setAutoSizeTextTypeWithDefaults(@NonNull TextView textView, int autoSizeTextType) {
if (VERSION.SDK_INT >= 27) {
textView.setAutoSizeTextTypeWithDefaults(autoSizeTextType);
} else if (textView instanceof AutoSizeableTextView) {
((AutoSizeableTextView)textView).setAutoSizeTextTypeWithDefaults(autoSizeTextType);
}
}
- 参数中的TextView就是我们要操作的textView
- 参数 int autoSizeTextType就是要设置的开关属性了,它接收2非参数。
- AUTOSIZETEXTTYPENONE:关闭自动调整功能。
- AUTOSIZETEXTTYPEUNIFORM:开启调整功能。
我们也可以通过layout-xml方式,来设置autoSizeTextType,因为是Support所以需要使用app:的命名空间:
<?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>
2.2.2、设置AutoSizeing缩放的粒度
粒度的作用也很简单,其实就是控制每次缩放的步长,当然在设置粒度的同时,你还需要设置缩放的范围,它会在这个范围内,根据设置的粒度进行缩放。
- 动态编码的方法
public static void setAutoSizeTextTypeUniformWithConfiguration(@NonNull TextView textView, int autoSizeMinTextSize, int autoSizeMaxTextSize, int autoSizeStepGranularity, int unit) throws IllegalArgumentException {
if (VERSION.SDK_INT >= 27) {
textView.setAutoSizeTextTypeUniformWithConfiguration(autoSizeMinTextSize, autoSizeMaxTextSize, autoSizeStepGranularity, unit);
} else if (textView instanceof AutoSizeableTextView) {
((AutoSizeableTextView)textView).setAutoSizeTextTypeUniformWithConfiguration(autoSizeMinTextSize, autoSizeMaxTextSize, autoSizeStepGranularity, unit);
}
}
- layout-xml方式
<TextView
android:layout_width="match_parent"
android:layout_height="200dp"
app:autoSizeTextType="uniform"
app:autoSizeMinTextSize="12sp"
app:autoSizeMaxTextSize="100sp"
app:autoSizeStepGranularity="2sp" />
2.2.3、预设尺寸
一般情况下通过设置粒度就能达到需求,如果对缩放有更精准的要求的话,就需要进行预设尺寸了。如 [10.15,40,60,100] 这样的缩放,使用粒度就达不到我们的要求了。
- 动态编码方式
public static void setAutoSizeTextTypeUniformWithPresetSizes(@NonNull TextView textView, @NonNull int[] presetSizes, int unit) throws IllegalArgumentException {
if (VERSION.SDK_INT >= 27) {
textView.setAutoSizeTextTypeUniformWithPresetSizes(presetSizes, unit);
} else if (textView instanceof AutoSizeableTextView) {
((AutoSizeableTextView)textView).setAutoSizeTextTypeUniformWithPresetSizes(presetSizes, unit);
}
}
- layout-xml方式
首首先需要一个 array 的资源,然后通过 autoSizePresetSizes 属性进行设置即可。
array 资源的格式:
<resources>
<array name="autosize_text_sizes">
<item>10sp</item>
<item>12sp</item>
<item>20sp</item>
<item>40sp</item>
<item>100sp</item>
</array>
</resources>
将array设置进去
<TextView
android:layout_width="match_parent"
android:layout_height="200dp"
app:autoSizeTextType="uniform"
app:autoSizePresetSizes="@array/autosize_text_sizes" />
三、注意点
3.1、TextView必须设置尺寸
用官方文档话来说,使用 wrap_content 可能出现不可预料的效果。其实这也非常好理解,如果 TextView 的尺寸不是固定的,那就不存在 TextView 重新计算尺寸的依据了,同比放大 TextView 就可以达到容纳文字的效果了。
3.2、Autosizeing 不能作用在 EditText 上
我们可以通过查看AppCompatTextViewAutoSizeHelper 这个类中的supportsAutoSizeText()方法找到答案。
/**
* @return {@code true} if this TextView supports auto-sizing text to fit within its container.
*/
private boolean supportsAutoSizeText() {
// Auto-size only supports TextView and all siblings but EditText.
return !(mTextView instanceof AppCompatEditText);
}
网友评论