12

假设我有一个特定大小的TextView(实际上并不重要...... fill_parent、20dip 等等)。是否可以在不做大量数学运算的情况下告诉文本缩小/增大大小以适应可用空间?

4

4 回答 4

18

嗯,它比“很多复杂的数学”简单一点,但是如果你的文本宽度与你的文本视图的宽度相差不远,我会使用一个 hack 解决方案。

    // HACK to adjust text width
    final int INITIAL_TEXTSIZE = 15;
    final int TEXTVIEW_WIDTH = textviewBackground.getIntrinsicWidth(); // I use the background image to find the width, but you can use a fixed value or whatever other method you prefer.
    final String text = ...;
    textView.setText( text );

    int size = INITIAL_TEXTSIZE;
    while( textview.getPaint().measureText(text) > TEXTVIEW_WIDTH )
        textview.setTextSize( --size );

如果文本的宽度可能与 TextView 的宽度有显着差异,那么使用二进制搜索而不是线性搜索来找到正确的字体大小可能会更好。

并不是说这是一个理想的解决方案,但如果您不经常需要调整文本大小,这是一个权宜之计。如果您需要经常调整文本大小,最好做一些复杂的数学运算。

于 2010-03-25T16:41:28.737 回答
2

我尝试了几乎所有上述方法,但大多数都失败了,包括最上面的。我找到的最简单和最有效的方法来自 emmby,但发现您必须设置初始文本大小。这是对他的改进,您根本不需要指定任何文本大小:

  final String text = "HELP";

  TextView tvFlash = (TextView) findViewById(R.id.tvFlash);

  DisplayMetrics metrics = getResources().getDisplayMetrics();
  int width = metrics.widthPixels;
  int height = metrics.heightPixels;

  tvFlash.setText(text);
  tvFlash.setTextSize(TypedValue.COMPLEX_UNIT_PX, 1);

  int size = 1; 

  do
  {
    float textWidth = tvFlash.getPaint().measureText(text);

    if (textWidth < width)
      tvFlash.setTextSize(++size);
    else
    {
      tvFlash.setTextSize(--size);
      break;
    }
  }while(true);
于 2013-07-30T11:37:52.973 回答
0

不是我知道的,对不起。

于 2010-02-19T12:30:33.920 回答
0

你可以计算一个TextView的idea字体大小值。那是填充它而不会太大的字体大小。公式为:

fontSize = (TextView Height) * (width DPI / height DPI) / (Screen Width * Screen Height);

可以通过覆盖 Activity 中的 onConfigurationChanged 方法并使用 newConfig.screenWidthDp 和 newConfig.screenHeightDp 来获取宽度和高度 DPI。

可以使用以下帮助函数获取以像素为单位的屏幕大小

// Get Screen Size
static public Point getScreenSize(Activity aActivity)
{
    Display display = aActivity.getWindowManager().getDefaultDisplay();
    Point size = new Point();
    display.getSize(size);
    return size;
}

我只是根据需要计算这个值(在 onConfigurationChanged 中)并将其推送到某个静态帮助程序类。然后,当 TextView 需要确定要使用的字体大小时,它会将其从此类中拉出。

它有效,但可能不是最简单的解决方案。

于 2013-02-25T20:13:53.680 回答