2012-03-15 5 views
7

Я ищу способ, когда я изменяю размер экрана, он будет пропорционально изменять размер текста. В настоящее время я пробовал Auto Scale TextView Text to Fit within Bounds, но он не работает. но я не уверен, что я делаю это правильно или нет. Сейчас я в настоящее время позвонив поРазмер шрифта Auto Scale

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" /> 

ответ

34

Вам не нужно звонить AutoResizeTextView test, вы можете сказать TextView, так как класс расширяет TextView. Я не понимаю, зачем вам нужно звонить resizeText().

В любом случае, это особый класс, который мне нравится использовать для автоматического изменения размера текста.

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

я звоню с помощью другого класса, поэтому мне нужно позвонить тт я прав? Это все, что мне нужно, - это пойти в макет xml n использовать пользовательский класс как заголовок? – user1235085

+1

Btw ваши коды отлично работают для меня спасибо :) – user1235085

+0

Кажется, что вы поняли, но ясны; вы добавляете пользовательский класс в свой XML вместо «TextView», а затем в свой код вы ссылаетесь на него как на обычный «TextView». – adneal

2

Я использую это пропорционально по ширине экрана.

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

CONST - это номер, который я использую для масштабирования шрифта в требуемом измерении. Это работает для моих нужд.

Смежные вопросы