2016-01-25 3 views
0

TextView имеет форму большого квадрата на экране. Текст внутри должен быть изменен так, чтобы он был как можно большим и соответствовал всему пространству TextView.Android: изменение размера шрифта в квадрате TextView

Скажем, текст «привет», результатом будет большой «привет» на экране.

Я спрашиваю здесь, как изменить размер шрифта до нужной величины пикселя, если квадрат имеет известный размер.

Я знаю, что отображаемая строка не может быть идеально квадратной, но главная цель состоит в том, чтобы текст был как можно большим, внутри области TextView.

+1

Do у вас есть код, с которым мы можем работать для начала? –

+0

@ Roman Rozenshtein Это только размер шрифта, который мне нужен, мне не нужны предложения о других вещах – P5music

ответ

0
Override following method: 

@Override 
public void onWindowFocusChanged (boolean hasFocus) { 
     // the height will be set at this point 
     int height = myEverySoTallView.getMeasuredHeight(); 
     int width = myEverySoTallView.getMeasuredWidth(); 

     //as per width/height you can try modifying text size 
     myTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP, width/SOME_CONSTANT); 
} 
0

Ну, если вы хотите, чтобы текст, который можно сделать в обычном режиме (как и в повороте на 0 градусов), но масштаб для удовлетворения границы View, вы можете использовать что-то вроде этого:

public class ScalingTextCustomTextView extends CustomTextView { 

    public ScalingTextCustomTextView(Context context) { 
     super(context); 
    } 

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

    @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); 

     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()); 
    } 

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

    private void refitText(String text, int textWidth) { 
     if(textWidth <= 0) 
      return; 

     int targetWidth = textWidth - this.getPaddingLeft() - this.getPaddingRight(); 
     float hi = 200; 
     float lo = 2; 
     final float threshold = 0.5f; 

     Paint temp = new Paint(); 
     temp.set(getPaint()); 

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

      if(temp.measureText(text) >= targetWidth) 
       hi = size; 
      else lo = size; 
     } 

     this.setTextSize(TypedValue.COMPLEX_UNIT_PX, lo); 
    } 
}` 

Если вы хотите, чтобы повернуть на 45 градусов, вы можете просто добавить:

@Override 
public void onDraw(Canvas canvas){ 
    canvas.save(); 
    canvas.rotate(45, canvas.getWidth()/2, canvas.getHeight()/2); 
    super.onDraw(canvas); 
    canvas.restore(); 
} 

Но если вы хотите, чтобы масштаб немного больше, чтобы соответствовать самому большому расстоянию, вы должны настроить refitText для вычисления целевых ширинов на основе на расстоянии fr om сверху вниз вправо-вправо.

Это должно указывать на вас в правильном направлении.

+0

Квадрат имеет известный и фиксированный размер, он не изменяется в реальном времени, мой вопрос возникает из-за того, что персонажи имеют разный размер , поэтому слово будет отличаться от другого. Забудьте также вращение, так как текст тоже вращается. Однако я отредактировал мой вопрос. – P5music

+0

ScalingTextCustomTextView в моем ответе на самом деле относится и к этому случаю. Он обновляет текст в соответствии с представлением при изменении текста или изменении размера представления. – Guardanis

0

Я думаю, что это достаточно, чтобы установить нужный размер TextView (myTextViewSize), а затем установить текстовое содержимое (он находится внутри точно с моими требуемыми размерами зрения),

затем использовать

Rect bounds = new Rect(); 
textView.getPaint().getTextBounds(textView.getText(), 0, textView.getText().length(), bounds); 
int oldTextWidth=bounds.width(); 
float oldFontSize=textView.getTextSize(); 
float newFontSize=(myTextViewSize- textView.getPaddingLeft() - textView.getPaddingRight())*oldFontSize/oldTextWidth; 
Смежные вопросы