Autosizing TextViews
Demo地址:AutosizingTextViewDemo
在Android O中,TextView可用自动放大或缩小文本的大小,以便根据TextView的属性和边界填充其布局。这样设置可以更轻松地在不同屏幕上优化动态内容的文本大小。
Support 26支持在运行Android 8.0(API 26)之前版本的设备上自动调整TextView功能,最低API要求是 API 14。在android.support.v4.widget中的TextViewCompat类,以兼容此特性。
设置TextView自动调整大小
可以使用框架或支持库以编程方式或以XML格式设置TextView的自动调整大小。要设置XML属性,还可以使用Android Studio中的“Attribute”窗口。
有三种方式可以设置TextView的自动调整大小:
- 默认(Default)
- 间隔尺寸(Granularity)
- 预设尺寸(Preset Sizes)
注意:如果在XML文件中设置自动调整,则不建议对TextView的layout_width或layout_height属性使用值“wrap_content”。
默认(Default)
默认设置使TextView的自动调整尺寸在水平轴和垂直轴上均匀。
要以编程方式定义默认设置,调用setAutoSizeTextTypeWithDefaults(int autoSizeTextType)方法。
- AUTO_SIZE_TEXT_TYPE_NONE:关闭自动调整功能
- AUTO_SIZE_TEXT_TYPE_UNIFORM:以均衡缩放水平轴和垂直轴
统一缩放的默认维度为minTextSize = 12sp,maxTextSize = 112sp,间隔尺寸= 1px
- 要在XML中定义默认设置,使用android命名空间,将autoSizeTextType属性设置为none或uniform
<?xml version="1.0" encoding="utf-8"?>
<TextView
android:layout_width="match_parent"
android:layout_height="200dp"
android:autoSizeTextType="uniform" />
使用支持库
要通过支持库以编程方式定义默认设置,调用TextViewCompat.setAutoSizeTextTypeWithDefaults(TextView textview,int autoSizeTextType)方法。提供TextView控件的实例和文本类型。文本类型如下:
- TextViewCompat.AUTO_SIZE_TEXT_TYPE_NONE:关闭自动调整功能
- TextViewCompat.AUTO_SIZE_TEXT_TYPE_UNIFORM:以均衡缩放水平轴和垂直轴
- 要通过支持库定义XML中的默认设置,使用app命名空间,将autoSizeTextType属性设置为none或uniform
<?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>
间隔尺寸(Granularity)
可以定义最小和最大文本尺寸的范围以及指定每个步长的尺寸。TextView在最小和最大文本尺寸之间的范围内均匀地缩放。每个增量按照autoSizeStepGranularity属性中设置的步长进行缩放。
要以编程方式定义文本大小和尺寸范围,调用setAutoSizeTextTypeUniformWithConfiguration(int autoSizeMinTextSize,int autoSizeMaxTextSize,int autoSizeStepGranularity,int unit)方法。
- autoSizeMinTextSize:最小值
- autoSizeMaxTextSize:最大值
- autoSizeStepGranularity:步长
- unit:任何TypedValue尺寸单位
要在XML中定义一系列文本大小和尺寸,使用android命名空间并设置以下属性:
- android:autoSizeTextType:none或uniform
- android:autoSizeMinTextSize
- android:autoSizeMaxTextSize
- android:autoSizeStepGranularity
<?xml version="1.0" encoding="utf-8"?>
<TextView
android:layout_width="match_parent"
android:layout_height="200dp"
android:autoSizeTextType="uniform"
android:autoSizeMinTextSize="12sp"
android:autoSizeMaxTextSize="100sp"
android:autoSizeStepGranularity="2sp" />
使用支持库
要以编程方式定义文本大小和尺寸范围,调用TextViewCompat.setAutoSizeTextTypeUniformWithConfiguration(int autoSizeMinTextSize, int autoSizeMaxTextSize, int autoSizeStepGranularity, int unit) ,提供以下参数:
- autoSizeMinTextSize:最小值
- autoSizeMaxTextSize:最大值
- autoSizeStepGranularity:步长
- unit:任何TypedValue尺寸单位
要在XML中定义一系列文本大小和尺寸,使用app命名空间并设置以下属性:
- app:autoSizeTextType:none或uniform
- app:autoSizeMinTextSize
- app:autoSizeMaxTextSize
- app:autoSizeStepGranularity
<?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>
预设尺寸(Preset Sizes)
预设尺寸可以让在自动自动调整文本时TextView选择的所有指定的值。
以编程方式设置TextView的自动调整,调用setAutoSizeTextTypeUniformWithPresetSizes(int [] presetSizes,int unit)方法。
- presetSizes:指定的文本尺寸列表
- unit:任何TypedValue尺寸单位
在设置XML中设置TextView自动调整大小,使用android命名空间并设置以下属性。在res/values/ arrays.xml文件中定义尺寸数组,将尺寸数组作为资源访问:
- android:autoSizeTextType:none或uniform
- android:autoSizePresetSizes
<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" />
使用支持库
以编程方式设置TextView的自动调整,TextViewCompat.setAutoSizeTextTypeUniformWithPresetSizes(TextView textView, int[] presetSizes, int unit),提供以下参数
- textView
- presetSizes::指定的文本尺寸列表
- unit:任何TypedValue尺寸单位
在设置XML中设置TextView自动调整大小,使用app命名空间并设置以下属性。在res/values/ arrays.xml文件中定义尺寸数组,将尺寸数组作为资源访问:
- app:autoSizeTextType:none或uniform
- app:autoSizePresetSizes
<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>