2012-03-15 18 views
7

Estoy buscando una manera de cuando cambie el tamaño de una pantalla, se ajustará proporcionalmente el tamaño del texto. Actualmente probé Auto Scale TextView Text to Fit within Bounds pero parece que no funciona. pero no estoy seguro de hacerlo de la manera correcta o no. Ahora estoy actualmente llamando porEscala automática de texto Tamaño

AutoResizeTextView test = new AutoResizeTextView(this); 
test=(AutoResizeTextView)findViewById(R.id.test456); 
test.resizeText(); // I call this to resize.. am I right? 

XML

<com.mypackage.AutoResizeTextView 
android:id="@+id/test456" 
android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:layout_weight="1" /> 

Respuesta

34

No es necesario llamar AutoResizeTextView test, se puede decir TextView ya que la clase se extiende TextView. No veo por qué tendrías que llamar al resizeText() tampoco.

De cualquier manera, aquí hay una clase personalizada que me gusta usar para cambiar automáticamente el tamaño del texto.

public class AutoFitTextView extends TextView { 

public AutoFitTextView(Context context) { 
    super(context); 
    init(); 
} 

public AutoFitTextView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    init(); 
} 

private void init() { 

    maxTextSize = this.getTextSize(); 
    if (maxTextSize < 35) { 
     maxTextSize = 30; 
    } 
    minTextSize = 20; 
} 

private void refitText(String text, int textWidth) { 
    if (textWidth > 0) { 
     int availableWidth = textWidth - this.getPaddingLeft() 
       - this.getPaddingRight(); 
     float trySize = maxTextSize; 

     this.setTextSize(TypedValue.COMPLEX_UNIT_PX, trySize); 
     while ((trySize > minTextSize) 
       && (this.getPaint().measureText(text) > availableWidth)) { 
      trySize -= 1; 
      if (trySize <= minTextSize) { 
       trySize = minTextSize; 
       break; 
      } 
      this.setTextSize(TypedValue.COMPLEX_UNIT_PX, trySize); 
     } 
     this.setTextSize(TypedValue.COMPLEX_UNIT_PX, trySize); 
    } 
} 

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

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

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

public float getMinTextSize() { 
    return minTextSize; 
} 

public void setMinTextSize(int minTextSize) { 
    this.minTextSize = minTextSize; 
} 

public float getMaxTextSize() { 
    return maxTextSize; 
} 

public void setMaxTextSize(int minTextSize) { 
    this.maxTextSize = minTextSize; 
} 

private float minTextSize; 
private float maxTextSize; 

} 
+0

Voy a llamar a través de otra clase por eso es necesario llamar tt Estoy en lo cierto? ¿Es que todo lo que necesito es ir a la distribución xml n usar la clase personalizada como encabezado? – user1235085

+1

Por cierto, tus códigos funcionan perfectamente para mí, gracias :) – user1235085

+0

Parece que lo tienes, pero para ser claro; usted agrega la clase personalizada en su XML en lugar de 'TextView', luego en su código lo referencia como un' TextView' normal. – adneal

2

Utilizo esto, proporcionalmente al ancho de la pantalla.

DisplayMetrics displaymetrics = new DisplayMetrics(); 
     getWindowManager().getDefaultDisplay().getMetrics(displaymetrics); 
     width_screen=displaymetrics.widthPixels; 
Mytext.setTextSize(TypedValue.COMPLEX_UNIT_PX, (width_screen/CONST)); 

CONST es un número que uso para escalar la fuente, en la dimensión que quiero. Funciona para mis necesidades.

Cuestiones relacionadas