我正在测量文本Paint.getTextBounds(),因为我有兴趣获得要渲染的文本的高度和宽度.但是,实际呈现的文本总是比填充.width()的Rect信息宽一些getTextBounds().
令我惊讶的是,我进行了测试.measureText(),发现它返回了一个不同的(更高)值.我试一试,发现它是正确的.
为什么他们报告不同的宽度?我怎样才能正确获得高度和宽度?我的意思是,我可以使用.measureText(),但后来我不知道我是否应该相信.height()返回者getTextBounds().
根据要求,这里是重现问题的最小代码:
final String someText = "Hello. I believe I'm some text!";
Paint p = new Paint();
Rect bounds = new Rect();
for (float f = 10; f < 40; f += 1f) {
p.setTextSize(f);
p.getTextBounds(someText, 0, someText.length(), bounds);
Log.d("Test", String.format(
"Size %f, measureText %f, getTextBounds %d",
f,
p.measureText(someText),
bounds.width())
);
}
Run Code Online (Sandbox Code Playgroud)
输出显示的差异不仅得到大于1(且没有最后一分钟的舍入误差),也似乎增加与大小(我正要吸引更多的结论,但它可能是完全的字体相关的):
D/Test ( 607): Size 10.000000, measureText 135.000000, …Run Code Online (Sandbox Code Playgroud) 所以我在android中有一个TextView,它具有整个屏幕长度的宽度和一个dip 5的填充.我如何计算出适合屏幕上一行的字符数?我想换句话说,我正在尝试获取textview的列数?
我考虑了手工计算取决于文本大小和宽度,但是1)不知道相关性和2)由于以倾角为单位的填充,不同的屏幕将使用不同数量的实际像素来填充.
总体问题:我正在尝试使用它来解决:如果给出一个字符串,我怎样才能手动编辑为字符串,这样当textview逐字符打印字符串时,我将知道何时开始一个不适合一个字符的单词下一行.注意:我知道textview会自动放入不适合下一行的单词,但是,由于我是逐个字符打印,比如输入动画,textview不知道这个单词在打印出来之前是不适合的溢出的那个词的字符.
一直在寻找这个......
谢谢!
添加解决方案
一种可能的方案:
public String measure2 (TextView t, String s) {
String u = "";
int start = 0;
int end = 1;
int space = 0;
boolean ellipsized = false;
float fwidth = t.getMeasuredWidth();
for(;;) {
//t.setText(s.substring(start, end));
float twidth = t.getPaint().measureText(s.substring(start, end));
if (twidth < fwidth){
if (end < s.length())
end++;
else {
if (!ellipsized)
return s;
return u + s.subSequence(start, end);
}
}
else {
ellipsized = true;
space = (u + …Run Code Online (Sandbox Code Playgroud)