当我等待这个问题的可能解决方案时,我一直在尝试并试图找出答案。
这个问题最接近的解决方案是基于油漆的方法。
基本上,paint 有一个名为“breaktext”的方法,该方法:
public int breakText (CharSequence text, int start, int end, boolean
向前测量,浮动最大宽度,浮动[]测量宽度)
添加到 API 级别 1
测量文本,如果测量的宽度超过则提前停止
最大宽度。返回测量的字符数,如果
measuredWidth 不为空,返回测量的实际宽度。
我将其与油漆“getTextBounds”结合起来:
public void getTextBounds(字符串文本,int开始,int结束,矩形边界)
添加到 API 级别 1
在边界(由调用者分配)中返回包围所有 > 字符的最小矩形,隐含原点为 (0,0)。
所以现在我可以获得适合给定宽度的字符数和这些字符的高度。
使用 while,您可以继续从要测量的字符串中移动删除字符并获取行数(通过使用 while(index
此外,您还必须为每两行添加一个变量高度,以表示行之间的空间(不计入 getTextBounds 中)。
作为示例代码,了解多行文本高度的函数如下所示:
public int getHeightOfMultiLineText(String text,int textSize, int maxWidth) {
paint = new TextPaint();
paint.setTextSize(textSize);
int index = 0;
int linecount = 0;
while(index < text.length()) {
index += paint.breakText(text,index,text.length,true,maxWidth,null);
linecount++;
}
Rect bounds = new Rect();
paint.getTextBounds("Yy", 0, 2, bounds);
// obtain space between lines
double lineSpacing = Math.max(0,((lineCount - 1) * bounds.height()*0.25));
return (int)Math.floor(lineSpacing + lineCount * bounds.height());
注意:maxWidth 变量以像素为单位
然后,您必须在一段时间内调用此方法来确定该高度的最大字体大小是多少。示例代码如下:
textSize = 100;
int maxHeight = 50;
while(getHeightOfMultiLineText(text,textSize,maxWidth) > maxHeight)
textSize--;
不幸的是,这是我能够实现上图所示方面的唯一(据我所知)方法。
希望这对任何试图克服这一障碍的人都有帮助。