关于 Android 测量文字宽度的方法

2020-02-04

关键字:测量文本长度、测量字符串长度



最近在写 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 测量文字宽度的方法

原文地址:https://www.cnblogs.com/chorm590/p/12241428.html

时间: 2024-10-19 04:02:17

关于 Android 测量文字宽度的方法的相关文章

android获取文字宽度

Paint mTextPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mTextPaint.setColor(Color.WHITE); // Define the string. String displayText = “Hello World!”; // Measure the width of the text string. float textWidth = mTextPaint.measureText(displayText); android获

Android ToolBar标题文字居中的方法

在项目的开发中,使用苹果手机的产品,出的界面效果图极有可能(我这里是一定)完全是按照苹果的界面风格来出的,例如界面顶部的title文字位置是水平居中 如图: 那么问题来了,当我们使用ToolBar控件进行开发时,ToolBar的文字位置默认是靠左对齐的,不过这不能难道聪明的安卓开发者,解决方法如下: 1.只需要在ToolBar中添加TextView控件,设置位置为水平居中即可,代码奉上 <?xml version="1.0" encoding="utf-8"?

android精确绘制文字位置的方法

android 中使用Canvas的drawText绘制文本的位置,是基于基线的.如下图: 其中字母Q的小尾巴在横线下面了. 怎么样找准字母的中心位置呢? 先看下面的例子:(右边的数字,表示字体的 left, top, right, bottom) 这里面的关键是Paint.getTextBound. getTextBound会填充一个Rect,这个Rect表示的就是一个字的left, top, right, bottom.注意到left和top并不是从0,0开始的. left和right应该是

Android应用自定义View绘制方法手册

背景 这篇迟迟难产的文章算是对2015前半年的一个交代吧,那时候有一哥们要求来一发Android Canvas相关总结,这哥们还打赏了,实在不好意思,可是这事一放就给放忘了,最近群里小伙伴催着说没更新博客,坐等更新啥的,随先有这么一篇Android应用开发超级基础的文章诞生了(因为这种文章最好写哈,就是用熟了就行).不得不说下这么久为何一直没更新博客的原因了,首先遇上了过年,我个人崇尚过节就该放下一切好好陪陪亲人,珍惜在一起的时光:其次今年开年很是蛋疼,不是不顺当就是深深的觉得被坑,所以心情也就

调试 Android* x86 应用程序的方法以及要使用的工具

作者:Xiaodong Wang 1.简介 众所周知,Android* 开发人员头顶许多称呼:设计员.程序猿等,并且通常会不可避免地被称为故障检修工.代码中的错误无法避免,因此无论您是否一开始就造成错误,了解调试工具以及如何迅速而有效地跟踪并解决错误都很重要.鉴于此,如今的 Android 开发人员必须掌握有效的调试技巧.本文提供了 Android 应用程序调试工具的简单教学,用于帮助 Android SDK 以及相关工具的新手迅速入门,并在 Android x86 平台上更有效地解决故障. 2

Android 实现文字与图片的混排

在我们的项目中,经常会碰到图片与文字混排的问题.解决这类问题的方法有很多,本文给出的方法不是唯一的,只有根据实际场景才能找到更适合的方法. 本文主要通过xml布局来实现图片与文字的混排(水平排列). 1.利用TextView实现图片与文字混排, android:drawableBottom在text的下方输出一个drawable,如图片. 如果指定一个颜色的话会把text的背景设为该颜色,并且同时和background使用时覆盖后者. android:drawableLeft在text的左边输出

Android中Handler的使用方法——在子线程中更新界面

本文主要介绍Android的Handler的使用方法.Handler可以发送Messsage和Runnable对象到与其相关联的线程的消息队列.每个Handler对象与创建它的线程相关联,并且每个Handler对象只能与一个线程相关联. Handler一般有两种用途:1)执行计划任务,你可以再预定的实现执行某些任务,可以模拟定时器.2)线程间通信.在Android的应用启动时,会创建一个主线程,主线程会创建一个消息队列来处理各种消息.当你创建子线程时,你可以再你的子线程中拿到父线程中创建的Han

Android应用资源的使用方法(数组、颜色、尺寸、字符串、布尔、整数)

一.Android中资源分类详解 1.Android资源分类 Android中的资源分为两大类 : 可直接访问的资源, 无法直接访问的原生资源; -- 直接访问资源 : 这些资源可以使用 R. 进行访问, 都保存在res目录下, 在编译的时候, 会自动生成R.java 资源索引文件; -- 原生资源 : 这些资源存放在assets下, 不能使用 R类 进行访问, 只能通过 AssetManager 以二进制流形式读取资源; 2.Android资源详解 res目录下资源详解 : -- res/an

浅析android OCR文字识别

这学期有门课程老师要求用JAVA实现一个OCR文字识别的程序,所以就花了一些时间研究了一下在安卓端如何实现 OCR的引擎是用的开源项目tesseract-ocr 这个安卓版的地址:https://code.google.com/p/tesseract-android-tools/ 但是自己在编译的时候老是出错,于是在网上寻找到了别人编译好安卓可用的tess-two导入到项目中(参考文章地址 http://www.cnblogs.com/hangxin1940/archive/2012/01/13