【聊技术】在Android中实现自适应文本大小显示
本周的聊技术话题和大家说说如何在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 中Webview 自适应屏幕
随笔 - 478 文章 - 3 评论 - 113 Android 中Webview 自适应屏幕 webview中右下角的缩放按钮能不能去掉 settings.setDisplayZoomCon ...
- 在Eclipse Android中设置模拟器屏幕大小
在Eclipse Android中设置模拟器屏幕大小是本文要介绍的内容,主要是来了解并学习Eclipse Android中模拟器的设置,具体关于Eclipse Android内容的详解来看本文. 方法 ...
- 【转】Android 学习笔记——利用JNI技术在Android中调用、调试C++代码
原文网址:http://cherishlc.iteye.com/blog/1756762 在Android中调用C++其实就是在Java中调用C++代码,只是在windows下编译生成DLL,在And ...
- 反射技术在Android中的应用
本博客转自:http://blog.csdn.net/tiefeng0606/article/details/51700866 动态语言: 一般认为在程序运行时,允许改变程序结构或变量类型,这种语言称 ...
- [转][android][利用JNI技术在Android中调用、调试C++代码]
在Android中调用C++其实就是在Java中调用C++代码,只是在windows下编译生成DLL,在Android中会生成Linux系统下的.so文件(好吧,其实我基本没用过Linux). 没写过 ...
- Android中ActionBar及Overflow的显示
最近在按照Android的API文档学习Android中actionbar的使用,Action bar 最基本的形式,就是为 activity 显示标题,并且在标题左边显示一个 app icon.在这 ...
- Android中如何控制元素的显示隐藏?
在Android程序中,有时需要程序开启时默认隐藏某个控件,当单击某个按钮时才触发显示控件的内容.比如在查询员工资料时,提交查询后再显示查询到的表格内容: Android中控制元素的隐藏参考以下代码. ...
- Android中实现APP文本内容的分享发送与接收方法简述
谨记(指定选择器Intent.createChooser()) 开始今天的内容前,先闲聊一下: (1)突然有一天头脑风暴,对很多问题有了新的看法和见解,迫不及待的想要分享给大家,文档已经写好了,我需要 ...
- 利用JNI技术在Android中调用C++形式的OpenGL ES 2.0函数
1. 打开Eclipse,File-->New-->Project…-->Android-->AndroidApplication Projec ...
随机推荐
- Numpy_01
# 引子: # ndarray 是一个 numpy库提供的 同构数据多维模型 import numpy as np list=[1,2,3,4,5,6] myndarray=np.array(list ...
- java.sql.SQLException: Error: Error: could not match input
impala执行sql,输出后我在控制台粘贴执行OK,奇怪了. java.sql.SQLException: Error: Error: could not match input 原因竟然是myba ...
- 利用日志文件getshell
一.包含日志文件漏洞利用概述 当我们没有上传点,并且也没有url_allow_include功能时,我们就可以考虑包含服务器的日志文件. 利用思路也比较简单,当我们访 ...
- java.lang.IllegalStateException: Duplicate key 20
这个我在公司遇到的一个问题.原因:使用Map<String, String> RelationMap = relation.stream().collect(Collectors.toMa ...
- jquery 的 change() 方法的使用
w3c 中的定义:链接 <a>http://www.w3school.com.cn/jquery/event_change.asp<a> jQuery 事件 - change ...
- vue路由懒加载方式
方式一:结合Vue的异步组件和Webpack的代码分析 const Home = resole => {require.ensure(['../components/Home.vue'],() ...
- [原题复现]2018HCTF WEB admin(session伪造、unicode漏洞、条件竞争)
简介 原题复现:https://github.com/woadsl1234/HCTF2018_admin 考察知识点:session伪造.unicode漏洞.条件竞争 线上平台:https:// ...
- Java学习之Swing Gui编程
Java学习之Swing Gui编程 0x00 前言 前面的使用的Gui是基于Awt 去进行实现,但是在现实写Gui中 AWT实际运用会比较少. 0x01 Swing 概述 AWT 和Swing 区别 ...
- ABBYY FineReader 12/14版本功能对比及14产品优势
FineReader 是一款一体化的 OCR 和PDF编辑转换器,随着版本的更新,功能的增加,FineReader 14的推出继续为用户在处理文档时提高业务生产力,该版本包含若干新特性和功能增强,包括 ...
- 微课制作软件Camtasia中如何添加并编辑字幕?
除了能录制视频以外,Camtasia还能直接把录制下来的视频进行剪辑,并添加视频字幕等等一些后期效果.今天我们就来看一看字幕的添加方法. 导入视频 微课制作软件Camtasia录制的视频,默认在软件& ...