Android 测量文字宽度的实例方法

所属分类: 软件编程 / Android 阅读数: 54
收藏 0 赞 0 分享

最近在写 APK 时遇到了需要获取文本宽度的需求。其实就是要自己写一个算法以实现文本超长自动换行的功能。

在实现这一功能时发现了原来在 Android 中测量文本的长度,或者说宽度可以分两种情况:

1、测量绝对文本的长度

2、测量相对文本的长度

首先必须声明这两个概念是笔者自己定义的,因为我实在找不着更贴切的词句去形容它们了。

什么是绝对文本呢?

就是指那些字号、字体、粗细等属性不受在所运行的硬件设备上的 Android 系统的配置所影响文本。例如:自定义View时通过Canvas绘制出来的文本;

而相对文本在使用上就广泛很多了。例如直接用 TextView 展示的文本、网页上的文本、手机短信内容文本等。相对文本在字号、字体、粗细程度上除了受应用开发时的配置影响以外还会间接地受到系统设置的影响。例如在 Android 的系统设置 -- 显示 -- 字体大小 中的配置就会间接地影响到相对文本的显示效果。

这篇博文,就来记录一下这两种文本的测量长度的方法。

1、绝对文本长度的测量

绝对文本为了避免被系统配置影响到,通常都不使用 Android 自带的控件来绘制文本。

比较常见的绘制文本的方式是通过 Canvas 的 drawText() 方法。

绝对文本的长度的测量通常是借助 Paint 来完成的,代码也很简单:

final String txt = "冠状病毒是自然界广泛存在的病毒,因该病毒形态在电镜下观察类似王冠而得名。";
Paint paint = new Paint();
paint.setTextSize(15);
float length = paint.measureText(txt);
Logger.d(TAG, "txt length:" + length);

这种测量方式得到的结果值是不随系统显示字号的改变而改变的。

2、相对文本长度的测量

最简单的测量这种随系统配置而改变属性的文本的长度的方法就是借助于 Android 自身控件。这里贴出一种直接用 TextView 控件来测量的办法:

final String txt = "冠状病毒是自然界广泛存在的病毒,因该病毒形态在电镜下观察类似王冠而得名。";
TextView tv = new TextView(this);
tv.setTextSize(16);
tv.setText(txt);
TextPaint tp = tv.getPaint();
float length = Layout.getDesiredWidth(tv.getText().toString(), 0, tv.getText().length(), tp);
Logger.d(TAG, "txt length:" + length);
Logger.d(TAG, "screen width:" + ScannerApplication.getInstance().getHardware().getAppWidth());
((FrameLayout)layout).addView(tv);

这种方法里同样的字符串内容与 TextView 配置,却可以动态地根据系统的字体设置来测量文本长度。以下是同一段代码中在系统设置中将字体大小分别设置为小、普通与超大时的测量结果:

系统字体为小号时的测量结果:

Activity: txt length:720.0
Activity: screen width:720

系统字体为普通时的测量结果:

Activity: txt length:864.0
Activity: screen width:720

 

系统字体为超大时的测量结果:

Activity: txt length:1116.0
Activity: screen width:720

以上就是 Android 应用开发中关于文本长度测量的两种方法,各位同学根据自己的实际应用场景来选择使用即可。感谢大家的学习和对脚本之家的支持。

更多精彩内容其他人还在看

Android 自定义球型水波纹带圆弧进度效果(实例代码)

最近小编接到一个这样的需求,需要实现一个圆形水波纹,带进度,两层水波纹需要渐变显示,且外围有一个圆弧进度。今天小编给大家分享实例代码,感兴趣的朋友一起看看吧
收藏 0 赞 0 分享

Flutter 实现下拉刷新上拉加载的示例代码

这篇文章主要介绍了Flutter 实现下拉刷新上拉加载的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

Windows实现Flutter环境搭建及配置这一篇就够了

这篇文章主要介绍了Windows实现Flutter环境搭建及配置这一篇就够了,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

Android利用碎片fragment实现底部标题栏(Github模板开源)

Fragment可以作为Activity的组成部分,一个Activity可以有多个Fragment,这篇文章主要介绍了Android利用碎片fragment实现底部标题栏(Github模板开源),需要的朋友可以参考下
收藏 0 赞 0 分享

android studio 的下拉菜单Spinner使用详解

这篇文章主要介绍了android studio 的下拉菜单Spinner使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

解析Android 8.1平台SystemUI 导航栏加载流程

这篇文章主要介绍了Android 8.1平台SystemUI 导航栏加载流程,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

Android仿微信录音功能

这篇文章主要为大家详细介绍了Android仿微信录音功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android仿微信键盘切换效果

这篇文章主要为大家详细介绍了Android仿微信键盘切换效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android超清晰6.0权限申请AndPermission

这篇文章主要介绍了Android超清晰6.0权限申请AndPermission,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android仿微信录制语音功能

这篇文章主要介绍了Android仿微信录制语音功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享
查看更多