将视图中的文本缩放以适应?

11

我不相信这个存在,但想再次确认一下。我想设置一个TextView的文本大小,使其适合给定宽度的单行。例如:

<LinearLayout
  layout_width="100dip"
  layout_height="50dip">

  <TextView
    layout_width="fill_parent"
    layout_height="wrap_content"
    textSize="fill" 
    text="fit me please!" />

</LinearLayout>

谢谢

4个回答

11

您可以使用TextUtils.EllipsizeCallback。当文本被省略时,此回调由textview执行。在这里,您可以将文本大小设置为小于当前的大小。

编辑:否则,您可以以以下方式使用TextUtils.ellipsize

while (mText != TextUtils.ellipsize(mText, textPaint, other params)) { 
    textpaint.setTextSize(textpaint.getTextSize() - 1);
}

1
小心点。这是正确的想法,但getTextSize()返回PX,而setTextSize()需要DIP。你不想把一个喂到另一个里面去。在一个独立的变量中跟踪大小。 - Mason Lee
1
我将文本大小设置为绘图对象,而不是文本视图。当我找到合适的大小时,才将其设置为文本视图。因此,我认为使用这个想法没有任何问题。 - Ron
1
@userSevens7s 哦,继续!我第一次读的时候没看对,然后在我提到的愚蠢陷阱上卡住了自己。谢谢。 - Mason Lee
@userSeven7s,我正在使用这种方法,在这些设备上出现了java.lang.StackOverflowError错误:GT-I9192、D5803,API版本为4.2.2、4.4.4。 - GuilhE

5
这个自定义函数应该可以做到,使用TextUtils.ellipsize...
public static void shrinkTextToFit(float availableWidth, TextView textView,
                                   float startingTextSize, float minimumTextSize) {

    CharSequence text = textView.getText();
    float textSize = startingTextSize;
    textView.setTextSize(startingTextSize);
    while (text != (TextUtils.ellipsize(text, textView.getPaint(),
                                        availableWidth, TextUtils.TruncateAt.END))) {
        textSize -= 1;
        if (textSize < minimumTextSize) {
            break;
        } else {
            textView.setTextSize(textSize);
        }
    }
}

我正在使用这种方法,但在以下设备上出现了java.lang.StackOverflowError错误:GT-I9192、D5803,API版本为4.2.2和4.4.4。 - GuilhE

0

0

您可以始终将xml布局定义与Java结合使用,并动态定义文本的大小。您可能需要一些计算和从dip单位到当前屏幕使用的像素密度信息的引用,但一旦完成,它几乎可以保证解决所有情况下的问题。


嗨,是的,我已经写了一些代码来实现这个功能(有点丑),希望新版本的SDK可能会添加一个新标志来完成同样的事情。 - user291701

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接