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

最近在写 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 应用开发中关于文本长度测量的两种方法,各位同学根据自己的实际应用场景来选择使用即可。感谢大家的学习和对我们的支持。

(0)

相关推荐

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

    最近在写 APK 时遇到了需要获取文本宽度的需求.其实就是要自己写一个算法以实现文本超长自动换行的功能. 在实现这一功能时发现了原来在 Android 中测量文本的长度,或者说宽度可以分两种情况: 1.测量绝对文本的长度 2.测量相对文本的长度 首先必须声明这两个概念是笔者自己定义的,因为我实在找不着更贴切的词句去形容它们了. 什么是绝对文本呢? 就是指那些字号.字体.粗细等属性不受在所运行的硬件设备上的 Android 系统的配置所影响文本.例如:自定义View时通过Canvas绘制出来的文本

  • Android实现文字和图片混排(文字环绕图片)效果

    本文实例讲述了Android实现文字和图片混排(文字环绕图片)效果.分享给大家供大家参考,具体如下: 在平时我们做项目中,或许有要对一张图片或者某一个东西进行文字和图片说明,这时候要求排版美观,所以会出现文字和图片混排的情况,如图: 这种情况就是上下两个文字说明是连续在一起的,这就要求我们计算上面的文字说明怎么和下面的文字说明连贯结合在一起呢,这就要求我们进行计算了,下面给出代码,代码中也有详细的注释,原理也很简单. 因为算是比较简单,直接就在activity中去计算了: package com

  • Android实现文字消除效果

    今天和大家分享一个如何从右到左消除文本的动画. 先看效果图: 由于项目和语音识别相关,有时候人在不经意间交流的无效音频会被识别出来,并展示于界面,为了美观,客户要求我们将这些无效的识别文本用一个从右到左的动画给清除,于是便有了下述的技术实现. 嗯,效果做完后发现原理及其简单,仅此记录一下. 1.layout文件先在这儿贴一下 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:and

  • Android 实现文字左右对齐

    这里会涉及到实现原理的解析,如果只是需要使用轮子,请拉到最底下: 1. TextView 效果 首先,让我们先来看一下TextView的显示效果: 中文情况下还好,但是英文情况下的显示效果就不是很好看了,右边会留了很长的空白,对于追求用户体验的,这样的显示效果肯定是不能满足的:但是TextView内部也没有提供API给我们,那么就只能自己来实现了: 2. 对齐原理 原理:将一行剩余的宽度平分给当前单词的间距,这样来达到左右对齐的效果: 那么我们就有两种实现方案: (1)TextView绘制一行的

  • Android获取文字高度的三种方法

    前言 本文是对获取文字高度整理和总结,参考资料源自 statcoverflow的一个回答.具体参看下面的参考链接 获取文字高度的三个方法 paint.getTextBounds(String text, int start, int end, Rect bounds) paint.getFontMetrics() StaticLayout 1 paint.getTextBounds(String text, int start, int end, Rect bounds) 参数解释 text :

  • Android MarkTipsView文字标识控件使用方法

    本文实例为大家分享了Android MarkTipsView文字标识控件的具体代码,供大家参考,具体内容如下 效果预览 使用 使用方式跟TextView使用方式一样,背景设置直接setBackgroundColor 源码: import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Color; impo

  • Android实现文字滚动效果

    Android 实现文字滚动效果,自己写了个timer小计时器,textview文字上下翻动效果: public class AutoTextView extends TextSwitcher implements ViewSwitcher.ViewFactory { private float mHeight; private Context mContext; //mInUp,mOutUp分别构成向下翻页的进出动画 private Rotate3dAnimation mInUp; priva

  • jQuery(js)获取文字宽度(显示长度)示例代码

    今天遇到了获取文字宽度的问题,查了很久,终于在一个国外网站上找到了方法,但是不能直接使用,于是修改了一下,成功使用到了项目中,在这里分享给大家. 首先在body标签最后添加一个子标签: 复制代码 代码如下: <span id="ruler">test</span> 然后添加相应的css代码: 复制代码 代码如下: #ruler { visibility: hidden; white-space: nowrap; font-size: 24px; } 接下来直接在

  • Android实现文字逐字显示出来

    先上Android实现文字逐字显示出来效果图,供大家参考,具体内容如下 可以采用自定义TextView的方式去实现,也可才用定时更新文字显示,思路是让TextView每隔一秒显示以一个字符串(并非每一秒多出来一个汉字),那么就简单了,可以开启一个线程,那么线程主要方法如下: public static void startTv(final int n) { new Thread( new Runnable() { @Override public void run() { try { final

  • Android实现文字翻转动画的效果

    本文实现了Android程序文字翻转动画的小程序,具体代码如下: 先上效果图如下: 要求: 沿Y轴正方向看,数值减1时动画逆时针旋转,数值加1时动画顺时针旋转. 实现动画的具体细节见"RotateAnimation.Java".为方便查看动画旋转方向,可以将RotateAnimation.DEBUG值设置为true即可.
 RotateAnimation参考自APIDemos的Rotate3DAnimation
 RotateAnimation的构造函数需有三个参数,分别说明动画组件的

随机推荐