本周的聊技术话题和大家说说如何在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.AppCompatTextViewandroid: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中实现自适应文本大小显示相关推荐

  1. 5 控件固定大小_【聊技术】在Android中实现自适应文本大小显示

    本周的聊技术话题和大家说说如何在Android中实现自适应文本大小显示. 想象一下,在布局中,通常显示文本的区域大小是固定的,但是文本长度并不总是固定的.比如列表中的文章标题.界面下方的按钮文本等等. ...

  2. CSS中的自适应字体大小

    本文翻译自:Responsive font size in CSS I've created a site using the Zurb Foundation 3 grid. 我已经使用Zurb Fo ...

  3. vue中echarts自适应屏幕大小

    vue中echarts自适应屏幕大小,延迟执行 项目中出现echarts适应屏幕大小,有时会遇到不管屏幕大小如何变化echarts图表大小不变的情况:或者出现图表变化延迟的情况,针对这两种情况,分别解 ...

  4. android调用音量方法,android中获取当前音量大小

    android中获取当前音量大小 (2012-11-07 08:40:41) 标签: it 通过程序获取android系统手机的铃声和音量.同样,设置铃声和音量的方法也很简单! 设置音量的方法也很简单 ...

  5. [Android] Eclipse Android中设置模拟器屏幕大小几种方法

    在Eclipse Android中设置模拟器屏幕大小是本文要介绍的内容,主要是来了解并学习Eclipse Android中模拟器的设置,具体关于Eclipse Android内容的详解来看本文  . ...

  6. 【机器视觉案例】(13) 脸部和摄像机间的距离测量,自适应文本大小,附python完整代码

    各位同学好,今天和大家分享一下如何使用 opencv+Mediapipe 测量人脸和摄像机镜头之间的距离,并创建一块根据人脸距离变化的文本框.先放张图看效果. 左图是视频图像,显示人脸和摄像机之间的距 ...

  7. android auto 字体大小,Android中给TextView字体大小用dp还是sp?dp和sp有什么区别?

    dp,sp都会根据屏幕ppi显示大小不同. ppi的运算方式是: PPI = (开根号(长度像素数² + 宽度像素数²)) / 屏幕对角线英寸数 dp:Density-independent pixe ...

  8. Android中App控制字体大小

    Android中App字体不随系统字体大小的改变而改变 通常是在Application或Activity中复写getResources方法 ,下面的代码就实现了app字体不随系统字体大小改变. ove ...

  9. Android中实现APP文本内容的分享发送与接收方法简述

    谨记(指定选择器Intent.createChooser()) 开始今天的内容前,先闲聊一下: (1)突然有一天头脑风暴,对很多问题有了新的看法和见解,迫不及待的想要分享给大家,文档已经写好了,我需要 ...

最新文章

  1. R语言ggplot2可视化在可视化图形的X轴标签中添加温度摄氏度符号(add temperature degree symbol on axis label)
  2. 基于Kmeans聚类算法的图像分割(色彩分割)实战
  3. 【Harvest源码分析】获取F0轮廓
  4. php和dart的区别,Dart相等和关系运算符
  5. 报头中的偏移量作用_C语言中函数的实现
  6. redis复制_Redis复制
  7. CTU 2017 J - Punching Power (二分图匹配)
  8. oracle 备份导出,oracle 怎么备份或导入导出表
  9. 《软件项目管理(第二版)》第 3 章——项目计划 重点部分总结
  10. React-Native组件之Text内文字垂直居中方案
  11. 计算机Word2010中刷新键,Office2010常用快捷键汇总(最新整理)
  12. Linux网络操作系统及应用教程( 项目式)项目一
  13. 小程序 版本管理使用教程
  14. 做项目的一些思路(针对小白)
  15. 整理41个Python不同方面的练习题,希望对你有帮助
  16. 4.28日机器人队任务
  17. 2015最新经典语句搞笑段子
  18. Error: Cannot find module ‘process-nextick-args‘,error:0308010C:digital envelope routines::unsupport
  19. 数学知识 试除法求约数
  20. python flash_Python Flask使用flash()方法

热门文章

  1. 中国电影|嘉宝盘点近几年国内票房突破30亿的影片
  2. 嵌入式软件管培生每日总结-第6-7天
  3. 2022煤炭生产经营单位(安全生产管理人员)判断题及在线模拟考试
  4. Android开机启动流程
  5. 小白操作:zuul网关升级为getway网关,以及jwt的使用
  6. 花里胡哨的天气插件代码生成
  7. 思科模拟器 --- 路由器静态路由配置
  8. cz73 读取速度慢_【闪迪 Ultra Flair 酷铄 CZ73 闪存盘使用总结】速度|读取|写入|手感_摘要频道_什么值得买...
  9. 早该消失的埃菲尔铁塔为何存在至今?
  10. MAC地址IP地址 端口