Android8 字体自动缩放

2018-03-07  本文已影响0人  longshuai

Android 8.0 允许根据TextView的内容和边界自动缩放文本内容
实现方式:
1、兼容方式:低版本机器可以支持显示
2、Android8自带Api实现:Androi8以上机器才支持显示

一、兼容方式实现:
1.1、添加依赖:

  compile 'com.android.support:appcompat-v7:26.1.0'
  compile 'com.android.support:support-v4:26.1.0'

TextView的autoSize采用v7包适配,需要版本号26.1.0以上
(具体参考https://developer.android.com/reference/android/support/v4/widget/TextViewCompat.html

如果出现:

Error:Failed to resolve: com.android.support:appcompat-v7:26.1.0

在项目中build.gradle:加入maven就可以解决

allprojects {
  repositories {
      maven { url "https://maven.google.com" } //加这句
      jcenter()
  }
}

1.2、代码实现:
在xml中使用TextView:
然后代码实现:

private void initAutoTextView(TextView textView) {
    /**
     * android:autoSizeTextType="uniform"
     * the type of auto-size. Must be one of
     *  none: 关闭缩放功能
     *  uniform: 垂直方向与水平方向缩放
     *  26.1.0 版本才支持
    */
    TextViewCompat.setAutoSizeTextTypeWithDefaults(textView, TextViewCompat.AUTO_SIZE_TEXT_TYPE_UNIFORM);

    /**
     * 参数一: 被设置的TextView
     * 参数二: 自动缩放的最小字号
     * 参数三: 自动缩放的最大字号
     * 参数四: 参数二与参数三所用的单位,指定为SP
     */
    TextViewCompat.setAutoSizeTextTypeUniformWithConfiguration(textView,
            12, 48, 2, TypedValue.COMPLEX_UNIT_SP);

    /**
     * 参数一:
     * 参数二: 设置多个预制字体大小,这样在缩放时字体会根据预制的字体大小而缩放
     * 参数三: 参数二里面的Int值对应的单位,指定为SP
     */
    int[] autoTextSize = getResources().getIntArray(R.array.auto_text_sizes);
    TextViewCompat.setAutoSizeTextTypeUniformWithPresetSizes(textView, autoTextSize, TypedValue.COMPLEX_UNIT_SP);
}

ps:auto_text_sizes里面的值不需要带单位

<array name="auto_text_sizes">
    <item>12</item>
    <item>18</item>
    <item>20</item>
    <item>32</item>
    <item>42</item>
</array>

1.3、xml实现
固定高宽情况下,输入的字体自适应这个高宽

<!-- 兼容方式实现-->
<android.support.v7.widget.AppCompatTextView
    android:id="@+id/actv_auto_size"
    android:layout_width="200dp"
    android:layout_height="100dp"
    android:maxLines="3"
    android:ellipsize="end"
    android:text="哈哈哈哈哈666666"
    android:background="@android:color/darker_gray"
    app:autoSizeTextType="uniform"
    android:layout_margin="20dp"
    app:autoSizeMinTextSize="12sp"
    app:autoSizeMaxTextSize="100sp"
    app:autoSizeStepGranularity="2sp"
    app:autoSizePresetSizes="@array/preset_sizes"
    />

ps:这里需要带单位

<array name="preset_sizes">
    <item>12sp</item>
    <item>24sp</item>
    <item>36sp</item>
    <item>48sp</item>
    <item>60sp</item>
    <item>72sp</item>
    <item>84sp</item>
</array>

这里设置字体sp

二、Android8自带Api实现

2.1、代码实现:

@RequiresApi(api = Build.VERSION_CODES.O)
private void initAndroid8TextView(TextView textView) {

    textView.setAutoSizeTextTypeWithDefaults(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM);
    textView.setAutoSizeTextTypeUniformWithConfiguration(10,100,2,TypedValue.COMPLEX_UNIT_SP);
    int[] autoTextSize = getResources().getIntArray(R.array.auto_text_sizes);
    textView.setAutoSizeTextTypeUniformWithPresetSizes(autoTextSize, TypedValue.COMPLEX_UNIT_SP);

}

2.2、xml实现

<!--Android8 方式实现,需要在Android8以上机器才生效 -->
<TextView
    android:id="@+id/tv_auto_size"
    android:layout_width="200dp"
    android:layout_height="100dp"
    android:background="#888888"
    android:maxLines="3"
    android:text="啦啦啦啦啦啦啦啦"
    android:layout_marginTop="20dp"
    android:autoSizeTextType="uniform"
    android:autoSizeMinTextSize="16sp"
    android:autoSizeMaxTextSize="100sp"
    android:autoSizeStepGranularity="8sp"
    android:autoSizePresetSizes="@array/preset_sizes"
    />

基本的使用就是这样。。。

上一篇 下一篇

猜你喜欢

热点阅读