缩放TextView中的文本大小

时间:2010-02-19 04:45:08

标签: android textview

说我有一个特定大小的TextView(真的不重要...... fill_parent,20dip,等等)。是否有可能告诉文本缩小/增大以适应可用空间而不需要进行大量数学处理?

4 个答案:

答案 0 :(得分:18)

嗯,它比“很多复杂的数学”更简单,但是如果文本的宽度与文本视图的宽度相差太远,那么我使用的黑客解决方案是可行的。

    // 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的宽度明显不同,那么最好采用二分搜索而不是线性搜索来找到正确的字体大小。

不是说这是一个理想的解决方案,但如果你不经常需要调整你的文本大小,这是一个权宜之计。如果你需要经常调整你的文本大小,那么做一些复杂的数学可能会更好。

答案 1 :(得分: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);

答案 2 :(得分:0)

不是我知道,抱歉。

答案 3 :(得分:0)

你可以计算TextView的想法字体大小值。这是填充它而不是太大的字体大小。公式是:

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

可以通过覆盖活动中的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需要确定要使用的字体大小时,它会将其从此类中拉出来。

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