2010-02-19 142 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);