美文网首页
TextView的新特性AutoSizeing

TextView的新特性AutoSizeing

作者: code希必地 | 来源:发表于2020-08-24 16:13 被阅读0次

一、什么是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);
  <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);
    }

相关文章

网友评论

      本文标题:TextView的新特性AutoSizeing

      本文链接:https://www.haomeiwen.com/subject/wnsnjktx.html