美文网首页
Android TextView 根据宽度自适应字体大小

Android TextView 根据宽度自适应字体大小

作者: 逃离_102 | 来源:发表于2022-07-29 09:47 被阅读0次

    说明

    在Android开发中部分场景UI会要求根据宽度自适应字体大小的需求,下面就简单来说明一下怎么实现。

    autoSizeTextType属性

    在Android 8.0 (API level 26)以上,Android提供了autoSizeTextType属性,不过通过万能的拓展库中的AppCompatTextView可以最低支持到Android 4.0(API Level 14)及以上的系统(不过你的应用编译的targetSDKVersion必须在26及以上)。所以现在可以用这个属性直接实现,在之前是需用自定义Textview去实现的,既然有了就不再去解释之前的用法了。既要使用autoSizeTextType属性,又要实现兼容,注意使用AppCompatTextView代替TextView
    autoSizeTextType参数介绍:none: 关闭自动调整功能;uniform: 均匀缩放水平轴和垂直轴

    示例1

    //布局文件中直接使用
    <androidx.appcompat.widget.AppCompatTextView
       android:id="@+id/tx2"
       android:layout_width="match_parent"
       android:layout_height="50dp"
       android:text="发发呆几个丰富"
       android:maxLines="1"
       android:ellipsize="end"
       app:autoSizeTextType="uniform"
       app:autoSizeMaxTextSize="50sp"
       app:autoSizeMinTextSize="4sp"
       app:autoSizeStepGranularity="1sp"
       android:gravity="center_vertical"/>
    
    //代码中使用
    binding.tx2.text = "就发发发发达" 
    binding.tx2.setAutoSizeTextTypeWithDefaults(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM)
    binding.tx2.setAutoSizeTextTypeUniformWithConfiguration(1,200,1,TypedValue.COMPLEX_UNIT_DIP)
    

    布局文件中参数介绍
    autoSizeMaxTextSize:最大值;
    autoSizeMinTextSize:最小值;
    autoSizeStepGranularity:粒度值,即每次增量或减量的值(允许TextView在MinTextSize-MaxTextSize之间按StepGranularity的值为增量或减量来跳动);
    autoSizeTextType:none: 关闭自动调整功能;uniform: 均匀缩放水平轴和垂直轴;
    默认设置
    1,粒度xml设置时必须设置autoSizeTextType="uniform",代码设置setAutoSizeTextTypeUniformWithConfiguration时则已设置;
    2,默认设置其实minTextSize = 12sp、maxTextSize = 112sp、granularity = 1px的粒度设置;

    示例2:

    <array name="auto_size_text_sizes">
      <item>10sp</item>
      <item>15sp</item>
      <item>20sp</item>
      <item>40sp</item>
      <item>100sp</item>
    </array>
    
    <androidx.appcompat.widget.AppCompatTextView
        android:id="@+id/tx2"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:text="发发呆几个丰富fafasfasdfasdfasdfadsffghffhgfhgfhgfhgf"
        android:maxLines="1"
        android:ellipsize="end"
        app:autoSizeTextType="uniform"
        app:autoSizePresetSizes="@array/auto_size_text_sizes"
        android:gravity="center_vertical"
       tools:ignore="MissingConstraints" />
    
    //代码中设置
    binding.tx1.text = "就发发发发达的飞洒发是发送到发"
    val presetSizes = intArrayOf(10,15,20,25,30)
    binding.tx1.setAutoSizeTextTypeUniformWithPresetSizes(presetSizes,TypedValue.COMPLEX_UNIT_SP)
    

    预设大小,根据给的值自动调整字体大小,不连续,autoSizePresetSizes:预设大小的数组,建议放到res/values/arrays.xml文件里。

    总结

    还有2点需注意:
    1:要设置android:maxLines="n",n可以是任意值,不一定是1,目的就是让其发挥作用,不能用android:singleLine="true";
    2:该功能只针对已经存在的TextView的text有效,如果你setText()或append()后改变了text,则改变后不会自适应;因此在调用setText()或append()后,要重新通过代码调用TextViewCompat.setAutoSizeTextTypeUniformWithConfiguration()方法。

    就说到这了,有什么不对的地方,欢迎指正,有什么没说全的,欢迎讨论留言

    相关文章

      网友评论

          本文标题:Android TextView 根据宽度自适应字体大小

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