最近在写 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 应用开发中关于文本长度测量的两种方法,各位同学根据自己的实际应用场景来选择使用即可。感谢大家的学习和对小牛知识库的支持。
本文向大家介绍JS使用canvas中的measureText方法测量字体宽度示例,包括了JS使用canvas中的measureText方法测量字体宽度示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JS使用canvas中的measureText方法测量字体宽度。分享给大家供大家参考,具体如下: 工作项目中用到的东西,要限制一个容器的宽度,超过了这个宽度就要显示展开按钮,点击展开按钮要全
问题内容: 有什么方法可以在不渲染实际元素的情况下获得文本宽度的估算值?像画布TextMetrics一样? 案例:我需要估计ReactList的元素高度。为此,我需要大致知道文本元素将需要多少空间(或它们将跨越多少行)。 例如。 如果我知道someText将被渲染成一行的宽度以及该行的长度,那么我可以很容易地得出组件高度的合理估计。 编辑:请注意,这是非常重要的性能, 不应触碰DOM 问题答案:
本文向大家介绍Android TabLayout设置指示器宽度的方法,包括了Android TabLayout设置指示器宽度的方法的使用技巧和注意事项,需要的朋友参考一下 anroid 5.0 Design v7 包中引用了TabLayout 简单快速的写出属于自己的Tab切换效果 如图所示: 但是正常使用中你发现无法设置tablayout指示器的宽度。查看源码你会发现设计师将指示器的宽度设置成
本文向大家介绍Android获取文字高度的三种方法,包括了Android获取文字高度的三种方法的使用技巧和注意事项,需要的朋友参考一下 前言 本文是对获取文字高度整理和总结,参考资料源自 statcoverflow的一个回答。具体参看下面的参考链接 获取文字高度的三个方法 paint.getTextBounds(String text, int start, int end, Rect bound
本文向大家介绍js获取Html元素的实际宽度高度的方法,包括了js获取Html元素的实际宽度高度的方法的使用技巧和注意事项,需要的朋友参考一下 第一种情况就是宽高都写在样式表里,就比如#div1{width:120px;}。这中情况通过#div1.style.width拿不到宽度,而通过#div1.offsetWidth才可以获取到宽度。 第二种情况就是宽和高是写在行内中,比如style="wid
问题内容: 我想使用JavaScript计算字符串的宽度。是否可以不必使用等宽字体? 如果不是内置的,我唯一的想法就是为每个字符创建一个宽度表,但这是非常不合理的,特别是支持Unicode和不同类型的大小(以及与此相关的所有浏览器)。 问题答案: 创建具有以下样式的DIV。在JavaScript中,设置要测量的字体大小和属性,将字符串放入DIV中,然后读取DIV的当前宽度和高度。它将拉伸以适合内容