如何根据视图最大尺寸自动调整多行 TextView 上的文本大小?

2024-04-30

我一直在寻找一种在文本视图中自动调整文本的方法。通过我的搜索,我找到了很多解决方案,例如:

  • 字体适合文本视图 https://stackoverflow.com/questions/2617266/how-to-adjust-text-font-size-to-fit-textview
  • 自动调整文本视图大小 https://stackoverflow.com/questions/5033012/auto-scale-textview-text-to-fit-within-bounds?lq=1
  • 自动缩放/调整大小 https://stackoverflow.com/questions/2596452/how-to-scale-resize-text-to-fit-a-textview?lq=1

但和其他许多人一样,这些并不能解决我的问题。 当我们使用带有多行的 TextView 时,它们无法按预期工作。

基本上我的目标是这个:

正如您所看到的,文本根据宽度、高度调整大小,并且还注意换行符,创建多行文本视图。还可以更改字体。

我解决这个问题的想法之一是这样的:

int size = CONSTANT_MAX_SIZE;
TextView tv = (TextView) findViewById(R.id.textview1)
while(Math.abs(tv.getMeasuredHeight()) >= TEXTVIEW_MAX_HEIGHT) {
    size--;
    tv.setTextSize(size);
    tv.measure(MeasureSpec.UNSPECIFIED,MeasureSpec.UNSPECIFIED);
    i++;
}

CONSTANT_MAX_SIZE 是一个常量,定义字体的最大大小(TextView 中的 textsize 属性)

TEXTVIEW MAX HEIGHT 是一个常量,定义 uitextview 可以具有的最大大小。

每次文本视图中的文本更改时都会调用此函数。

textview xml 是这样的:

<TextView
     android:id="@+id/textview1"
     android:layout_width="200dp"
     android:layout_height="wrap_content"
     android:singleLine="false"
     android:inputType="textMultiLine"
     android:text=""
     android:textSize="150sp" />

由于宽度在 XML 中受到限制,因此只需要考虑视图的高度,因为调整它时 android 会在需要时自动创建多行。

尽管这是一个潜在的解决方案,但效果并不完美(远非如此),并且它不支持缩小大小(当您删除文本时)。

有什么建议和/或想法吗?


当我等待这个问题的可能解决方案时,我一直在尝试并试图找出答案。

这个问题最接近的解决方案是基于油漆的方法。

基本上,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--;

不幸的是,这是我能够实现上图所示方面的唯一(据我所知)方法。

希望这对任何试图克服这一障碍的人都有帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何根据视图最大尺寸自动调整多行 TextView 上的文本大小? 的相关文章

随机推荐