【问题标题】:Dynamic change text size for maintain 1 line?动态更改文本大小以保持 1 行?
【发布时间】:2014-09-03 11:01:18
【问题描述】:

我今年 17 岁,是意大利人。这是我的第一个应用程序。

我愚蠢地认为这段代码可以独立于屏幕在我的交换机上保持 1 行:

Inside at OnCreate()
   
while(SWITCH.getLineCount()>1)
                SWITCH.setTextSize(SWITCH.getTextSize()-1);

显然不起作用.. 为什么?

我已经阅读了很多问题,但我还没有弄清楚如何根据屏幕大小动态设置字体大小。

非常感谢。

编辑:我写的分散注意力

(SWITCH.getLineCount()-1)

而不是

(SWITCH.getTextSize()-1),

但还是不行。

【问题讨论】:

  • 您确定要将getLineCount() 加入setTextSize() 吗?不会是getTextSize()吗?
  • @mikeM。我使用 getTextSize() 来获取大小并将其减少一个 for 循环。你明白我的意思吗?
  • 我理解你想要做什么,但你的逻辑有缺陷。您想减小大小,直到文本适合一行。 getLineCount() 不返回文本大小,因此从中减去 1 并将其设置为新大小是没有意义的。循环中的行应该是SWITCH.setTextSize(SWITCH.getTextSize()-1);
  • @mikeM。绝对正确!我是个懦夫,我确信他写了 getTextSize() ,谢谢男孩。我试试。。

标签: java android fonts size dynamically-generated


【解决方案1】:

假设您的 TextView 具有 android:maxWidth 值

如下函数:

  • 获取最大宽度

  • 使用 Paint.measureWidth 检查实际宽度

  • 如果实际宽度大于最大值,字体大小会按比例缩小。

  • 循环继续,直到宽度小于最大值。

  • 出于安全原因,我引入了 iterCount 以确保循环最终会结束。

我没有测试代码,但是思路应该很清楚了:

private void adjustTextSize(TextView tv,  final String text) {
    float maxWidth = tv.getMaxWidth() * 0.9f;

    Paint p = tv.getPaint();
    float fontSize = p.getTextSize();
    float txtWidth;

    int iterCount = 10;

    while (--iterCount >= 0 &&  (txtWidth = p.measureText(text)) > maxWidth)  
        p.setTextSize(fontSize *= (maxWidth / txtWidth));

}

【讨论】:

  • 正确,我已经解决了。傻我!
  • 谢谢。但我不明白文本如何超过最大宽度.. 不是不可能吗?
  • 我已经尝试了代码和字体大小。但我不明白我必须设置多少 MaxWidth..
  • 您可以省略 maxWidth 并使用 layout_width="match_parent"。问题在于,在这种情况下,您在布局完成之前不知道尺寸。
【解决方案2】:

您可以省略 maxWidth 并使用 layout_width="match_parent"。麻烦的是,在这种情况下,您在布局完成之前不知道大小。有关布局完成时的通知,请参阅How to know when an activity finishes a layout pass?

从 onGlobalLayout() 你可以使用 tv.getWidth()

 final TextView tv= (TextView) findViewById(R.id.myView);

 tv.getViewTreeObserver().addOnGlobalLayoutListener(
       new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                float maxWidth = tv.getWidth() * 0.9f;

                String text = getResources().getString(R.string.myTextId); 
                float fontSize = tv.getTextSize();
                float txtWidth;

                int iterCount = 10;

                 while (--iterCount >= 0 &&  (txtWidth = tv.getPaint().measureText(text)) > maxWidth)  
                     tv.setTextSize(fontSize *= (maxWidth / txtWidth));

                 tv.setText(text);
             }
         });

我稍微更改了代码以将 textSize 分配给 TextView,而不是分配给底层的 Paint。这样比较正确。

【讨论】:

    【解决方案3】:

    稍后看看这个库here,它会做你想做的事

    只需将编译添加到您的 gradle 并将 xml 中的 <TextView 替换为 <me.grantland.widget.AutofitTextView,完成,魔法完成,rs

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-11
      • 1970-01-01
      • 2020-03-15
      • 1970-01-01
      • 2016-01-30
      • 1970-01-01
      • 2013-08-14
      • 1970-01-01
      相关资源
      最近更新 更多