2012-04-17 80 views
2

是否有TextView的任何屬性可以指定,以便其文本(字體大小)動態縮放以適應TextView? (類似於iPhone的自動縮小功能)可能指定TextView文本來縮放以適應TextView?

如果沒有,是否有任何人都遇到或想出解決這個問題的好的,簡單的解決方案? (並且它也適用於非英語語言。)

+2

也許這[鏈接](http://stackoverflow.com/questions/5033012/auto-scale-textview-text-to-fit-within-bounds)可能是有用的... – Ant4res 2012-04-17 13:02:37

+0

檢查此http:// stackoverflow.com/questions/7259016/scale-text-in-a-view-to-fit/7259136#7259136 – Ronnie 2014-03-19 12:18:26

回答

1

繼V4l3ri4的鏈接和從那裏產生的鏈接後,我想出了以下這些裸機解決方案,它不斷縮小TextView中的文本,直到它適合寬度方向中的TextView:

public class FontFitTextView extends TextView 
{ 
    private float maxTextSizePx; 

    public FontFitTextView(Context context) 
    { 
    super(context); 
    initialise(); 
    } 

    public FontFitTextView(Context context, AttributeSet attrs) 
    { 
    super(context, attrs); 
    initialise(); 
    } 

    public FontFitTextView(Context context, AttributeSet attrs, int defStyle) 
    { 
    super(context, attrs, defStyle); 
    initialise(); 
    } 

    /** Sets the maximum text size as the text size specified to use for this View.*/ 
    private void initialise() 
    { 
    maxTextSizePx = getTextSize(); 
    } 

    /** Reduces the font size continually until the specified 'text' fits within the View (i.e. the specified 'viewWidth').*/ 
    private void refitText(String text, int viewWidth) 
    { 
    if (viewWidth > 0) 
    { 
     TextPaint textPaintClone = new TextPaint(); 
     textPaintClone.set(getPaint()); 

     int availableWidth = viewWidth - getPaddingLeft() - getPaddingRight(); 
     float trySize = maxTextSizePx; 

     // note that Paint text size works in px not sp 
     textPaintClone.setTextSize(trySize); 

     while (textPaintClone.measureText(text) > availableWidth) 
     { 
     trySize--; 
     textPaintClone.setTextSize(trySize); 
     } 

     setTextSize(TypedValue.COMPLEX_UNIT_PX, trySize); 
    } 
    } 

    @Override 
    protected void onTextChanged(final CharSequence text, final int start, final int lengthBefore, final int lengthAfter) 
    { 
    super.onTextChanged(text, start, lengthBefore, lengthAfter); 

    refitText(text.toString(), getWidth()); 
    } 

    @Override 
    protected void onSizeChanged(int w, int h, int oldw, int oldh) 
    { 
    super.onSizeChanged(w, h, oldw, oldh); 

    if (w != oldw) 
     refitText(getText().toString(), w); 
    } 
} 

使用示例如下:

<view 
    class="com.mycompany.myapp.views.FontFitTextView" 
    android:layout_width="0dp" 
    android:layout_height="wrap_content" 
    android:layout_weight="1" 
    android:singleLine="true" /> 

我意識到這一點的實現可以優化和擴展,但只是想表明一個裸露的骨頭爲您解決延長或根據需要進行修改d。

哦,如果你需要一個縮小文本來代替TextView的Button,只需使用上面的代碼,但是擴展Button而不是TextView。

+0

Worked for me..Thanks .. – bakriOnFire 2014-01-15 14:44:31

+0

如何使用上面的示例在活動中設置文字 – Sanket990 2014-07-14 04:35:42

+0

Hey @ Sanket990,my上面的'FontFitTextView'類是'TextView'的擴展,因此您正常使用'setText(...)'方法。 – 2014-07-14 14:17:40