TextView的新特性AutoSizeing

2020-08-24  本文已影响0人  code希必地

一、什么是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上的使用

       /**
         *TextView.AUTO_SIZE_TEXT_TYPE_NONE 关闭AutoSizeing 默认为关闭
         * TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM 开启AutoSizeing
         */
        textView.setAutoSizeTextTypeWithDefaults(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM);
 <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:autoSizeTextType="uniform"
    android:textSize="20sp" />

2.1.2、低于Android8.0使用Support V26

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);
        }

    }
<?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);
        }

    }
 <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);
        }

    }
<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);
    }
上一篇 下一篇

猜你喜欢

热点阅读