美文网首页编程二三事精选案例
在Android中实现自适应文本大小显示

在Android中实现自适应文本大小显示

作者: 萧文翰 | 来源:发表于2020-12-08 10:28 被阅读0次

本周的聊技术话题和大家说说如何在Android中实现自适应文本大小显示。
想象一下,在布局中,通常显示文本的区域大小是固定的,但是文本长度并不总是固定的。比如列表中的文章标题、界面下方的按钮文本等等。
为了尽可能让这些文字可见,传统的做法是通过文本长度设置文本大小,或者通过android:ellipsize属性设置文本省略方式等等。
实际上,从Android O开始,Android API引入了自适应文本大小的简易实现。它不仅可以用于TextView,对于Button等具有文本显示的控件同样适用。通过androidX,还可以适配到低版本的Android中。
下面,我们以TextView为例,来看看如何使用它们吧。

开启自适应显示模式

我们以Empty Activity方式创建一个新的工程,其中默认包含了只显示Hello World!文本的TextView控件,我们为其加上id,并修改尺寸和默认文本。为了兼容低版本的Android设备,使用androidX中提供的的AppCompatTextView替代TextView。
完整的布局文件如下:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <androidx.appcompat.widget.AppCompatTextView
        android:id="@+id/activity_main_tv"
        android:layout_width="100dp"
        android:layout_height="20dp"
        android:text="abcdefghijklmno"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

然后,将程序运行起来,可以看到,文字的显示仅到字母“n”处就停止了,”o”并没有显示。显而易见,这是因为文本框的大小限制了文字的显示。

下面,我们来到MainActivity代码,调用setAutoSizeTextTypeWithDefaults();方法,开启自适应缩放。

private AppCompatTextView demoTv;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    demoTv = findViewById(R.id.activity_main_tv);
    demoTv.setAutoSizeTextTypeWithDefaults(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM);
}

重新运行后,可以看到文本被完整地显示出来了:

对于setAutoSizeTextTypeWithDefaults();方法,我们可以传入的参数值通常有两个,分别是TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM和TextView.AUTO_SIZE_TEXT_TYPE_NONE。对应开启自适应文本大小与否。

自定义文本缩放方式

下面,我们修改TextView的文本,继续追加:

android:text="abcdefghijklmnopqrstuvwxyz"

再次运行App,我们发现:无论自适应模式开关与否,都无法完整地显示所有文本。这时候,我们就要对文本大小的自动缩放进行自定义了。

设定缩放配置

首先要介绍一种通过设定缩放配置实现自定义缩放的方法。我们先来看代码:

demoTv.setAutoSizeTextTypeUniformWithConfiguration(4,15,2, TypedValue.COMPLEX_UNIT_SP);

如上代码所示,setAutoSizeTextTypeUniformWithConfiguration();是实现此种缩放方式的关键,它由4个参数构成。

  • 4:表示文本缩放的最小值;
  • 20:表示文本缩放的最大值;
  • 2:表示文本缩放的尝试步长;
  • TypedValue.COMPLEX_UNIT_SP:指定前三个参数使用SP作为单位。

可以这样理解,当文本无法显示完全时,系统将以步长为单位递减文本大小设定值,直到文本完全显示,或者尝试值小于给定的文本缩放的最小值。
重新运行App,可以看到文本已经被完整地显示出来了。

定义预设值

自定义缩放的第二种方式是通过定义预设值实现。我们还是直接看代码:

demoTv.setAutoSizeTextTypeUniformWithPresetSizes(new int[]{9, 11, 13, 15}, TypedValue.COMPLEX_UNIT_SP);

通过setAutoSizeTextTypeUniformWithPresetSizes();方法定义预设值,需要两个参数,第一个是预设值的具体数值;第二个则是预设值的单位。
以上面的代码为例,在进行文字缩放时,文字大小只能从9SP,11SP,13SP和15SP这4个值中取。遗憾的是,即使取到9SP,文字依然无法完全显示:

仔细观察图中第二行文字,可以发现文字的下面由于高度不够,被截去了一段。

小结

综上,我们总共讲解了三种文本自动缩放的方式。这三种方式无所谓孰优孰劣,只是使用场景的区别。有了它们,我们无需自己定义不同的文字大小,更无需自己实现文字的自适应缩放了。
最后,特别需要说明:一定要在xml以及java代码中使用AppCompatTextView控件,除非你的App只支持Android O及以上版本。
这次的分享就到这里,希望上述内容对你有所帮助。

相关文章

  • 在Android中实现自适应文本大小显示

    本周的聊技术话题和大家说说如何在Android中实现自适应文本大小显示。想象一下,在布局中,通常显示文本的区域大小...

  • css文本溢出

    A css实现单行文本溢出显示 ... B 实现多行文本溢出显示... C改变placeholder的字体颜色大小

  • UILabel如果让文本自适应

    UILabel如果让文本自适应经常遇到,UILabel里面的显示区域固定, 但是里面的文字显示合适的字体大小的...

  • 借助SVG文字尺寸自动缩放甚至突破Chrome 12px限制

    一、文本font-size大小自适应SVG实现方法 文字大小尺寸跟着容器的尺寸变化。 这对于一些需要尺寸自适应的s...

  • Android .9图制作

    前言:项目中常常会涉及到文本框的显示,但通常文本的大小是不确定的,为了能够使图片能够自适应文本的大小来调整图片的大...

  • Flutter学习笔记04-文本Widget

    1.Text 在Android中,使用TextView显示文本,iOS中使用UILabel来显示文本;Flutte...

  • 八、Flutter的基础Widget

    一. 文本Widget 在Android中,我们使用TextView,iOS中我们使用UILabel来显示文本; ...

  • Flutter的基础Widget

    一. 文本Widget 在Android中,我们使用TextView,iOS中我们使用UILabel来显示文本; ...

  • 自动调整字体文本框

    在指定大小的文本框中显示文本,当不断增加文本数量时,文本框大小不够大时候,需要自动调整字体的大小适应文本框大小,自...

  • Flutter(六)基础Widget

    1. 文本Widget 在Android中,我们使用TextView,iOS中我们使用UILabel来显示文本; ...

网友评论

    本文标题:在Android中实现自适应文本大小显示

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