2010-02-19 143 views
12

假设我有一个特定大小的TextView(其实并不重要...... fill_parent,20dip,无论如何)。是否有可能让文本缩小/增大以适应可用空间而不需要进行大量的数学计算?在TextView中缩放textSize

+0

请在这里看到的答案,工作得很好:在这里输入链接的描述] [1] [1]:http://stackoverflow.com/questions/5033012/auto-scale-textview-text-to-fit-within-bounds – AllDayAmazing 2015-05-21 20:45:25

回答

18

嗯,它比“很多复杂的数学”要简单一些,但是如果你的文本的宽度与你的textview的宽度相差不远,那么我使用这种方法是可行的。

// 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的宽度显著不同,它可能是更好的使用二进制搜索,而不是线性搜索来找到合适的字体大小。

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

+0

+1非常好的答案。应该是公认的IMO。 – 2011-01-05 11:29:47

0

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

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

的宽度和高度DPI可以通过覆盖在活性的onConfigurationChanged方法,以及使用newConfig.screenWidthDp和newConfig.screenHeightDp来获取。

在像素屏幕尺寸可以用下面的辅助函数

// 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需要确定使用什么字体大小时,它会将其从该类中拉出。

它的工作原理,但可能不是最简单的解决方案。

+0

没用。不考虑字符的长度。 – AndroidDev 2013-07-30 11:09:09

2

我尝试了几乎所有的上述和最失败,包括顶级之一。我发现最简单也最有效的是emmby,但发现你必须设置最初的文本大小。这里是他的,你不需要指定所有textsize的任何改善:

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);