动态更改文本大小以维持1行?

时间:2014-09-03 11:01:18

标签: java android fonts size dynamically-generated

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

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

Inside at OnCreate()

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

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

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

非常感谢。

编辑:为了分心,我写了

(SWITCH.getLineCount() - 1)

而不是

(SWITCH.getTextSize() - 1)

但仍然无效。

3 个答案:

答案 0 :(得分:0)

假设你的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));

}

答案 1 :(得分:0)

您可以省略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。这种方式更正确。

答案 2 :(得分:0)

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

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