2014-01-18 26 views
1

我想讓我的TextView中的文本適合屏幕。我需要實現這樣的:在TextView中製作文本適合屏幕

enter image description here

字母「A」必須在與高度相等設備屏幕高度屏幕的中心。我爲此創建了一個自定義TextView,如下所示,但這似乎不起作用。我的意思是我的文字(字母A)不適合屏幕的高度。我嘗試手動調整文字字體大小,但這不是我猜的正確方法。有人能指出一個更好的解決方案嗎?

package com.example; 

import android.content.Context; 
import android.content.res.TypedArray; 

import android.graphics.Paint; 
import android.graphics.Rect; 
import android.util.AttributeSet; 
import android.util.TypedValue; 
import android.widget.TextView; 

public class FontFitTextView extends TextView 
    { 
    private Paint mTestPaint; 
    private float maxFontSize; 
    private static final float MAX_FONT_SIZE_DEFAULT_VALUE = 20f; 

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

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

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

private void initialise(Context context, AttributeSet attributeSet) 
{ 
    if(attributeSet!=null) 
    { 
     TypedArray styledAttributes = context.obtainStyledAttributes(attributeSet, R.styleable.FontFitTextView); 
     maxFontSize = styledAttributes.getDimension(R.styleable.FontFitTextView_maxFontSize, MAX_FONT_SIZE_DEFAULT_VALUE); 
     styledAttributes.recycle(); 
    } 
    else 
    { 
     maxFontSize = MAX_FONT_SIZE_DEFAULT_VALUE; 
    } 

    mTestPaint = new Paint(); 
    mTestPaint.set(this.getPaint()); 
    //max size defaults to the initially specified text size unless it is too small 
} 

private void refitText(String text, int textWidth, int textHeight) 
{ 
    if (textWidth <= 0) 
     return; 
    int targetWidth = textWidth - this.getPaddingLeft() - this.getPaddingRight(); 
    int targetHeight = textHeight - this.getPaddingTop() - this.getPaddingBottom(); 
    float hi = maxFontSize; 
    float lo = 2; 
    final float threshold = 1f; // How close we have to be 

    mTestPaint.set(this.getPaint()); 

    Rect bounds = new Rect(); 

    while ((hi - lo) > threshold) 
    { 
     float size = (hi + lo)/2; 
     mTestPaint.setTextSize(size); 

     mTestPaint.getTextBounds(text, 0, text.length(), bounds); 

     if (bounds.width() >= targetWidth || bounds.height() >= targetHeight) 
      hi = size; // too big 
     else 
      lo = size; // too small 

    } 
    // Use lo so that we undershoot rather than overshoot 
    this.setTextSize(TypedValue.COMPLEX_UNIT_PX, lo); 
} 

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) 
{ 
    super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
    int parentWidth = MeasureSpec.getSize(widthMeasureSpec); 
    int height = getMeasuredHeight(); 
    refitText(this.getText().toString(), parentWidth, height); 
    this.setMeasuredDimension(parentWidth, height); 
} 

@Override 
protected void onTextChanged(final CharSequence text, final int start, final int before, final int after) 
{ 
    refitText(text.toString(), this.getWidth(), this.getHeight()); 
} 

@Override 
protected void onSizeChanged(int w, int h, int oldw, int oldh) 
{ 
    if (w != oldw) 
    { 
     refitText(this.getText().toString(), w, h); 
    } 
    } 
} 

XML文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:res-auto="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/home_Layout" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" > 

<LinearLayout 
    android:id="@+id/linear1" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:gravity="center_vertical"> 

    <com.example.FontFitTextView 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:text="1" 
     android:textSize="80sp" 
     res-auto:maxFontSize="55sp" /> 

</LinearLayout> 

</RelativeLayout> 
+0

「_但這似乎並不奏效。」你能詳細說明一下嗎? – csmckelvey

+0

我編輯了這個問題。基本上我需要textview內的文本,以適應屏幕的高度。目前它不適合設備屏幕高度 –

回答

1

嘗試調用super.onMeasure()方法在onMeasure()方法與更新的寬度和高度(上級寬度,高度)的端部。

+0

嗨Naresh,我試過..但是,然後我沒有看到在屏幕上的文字。 ( –

+0

)嘗試在調用超級方法之前調整寬度和高度值。傳遞給super方法的這個值是決定寬度和高度的值。在parentWidth和height中的值可能太小或太小大的。試着調查研究它 –

+0

嗨,在Android中使用Log語句進行調試時,我將parentWidth設置爲480,高度設置爲0 –