2011-01-25 2 views
22

У меня есть текст, который должен быть установлен в TextView с указанной шириной. Он должен вычислить размер текста, чтобы он поместился в TextView.Вычислить размер текста в соответствии с шириной области текста

Другими словами: Есть ли способ подгонки текста в область TextView, например, функция типа масштабирования ImageView?

+1

Отметьте этот ответ здесь http://stackoverflow.com/questions/7259016/scale-text-in-a-view-to-fit/7259136#7259136 – Ronnie

ответ

29

Если это размер пространства Текст принимает ваш после, то следующее может помочь:

Paint paint = new Paint(); 
Rect bounds = new Rect(); 

int text_height = 0; 
int text_width = 0; 

paint.setTypeface(Typeface.DEFAULT);// your preference here 
paint.setTextSize(25);// have this the same as your text size 

String text = "Some random text"; 

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

text_height = bounds.height(); 
text_width = bounds.width(); 

Edit (после комментариев): Используйте выше в обратном направлении:

int text_height = 50; 
int text_width = 200; 

int text_check_w = 0; 
int text_check_h = 0; 

int incr_text_size = 1; 
boolean found_desired_size = true; 

while (found_desired_size){ 
    paint.setTextSize(incr_text_size);// have this the same as your text size 

    String text = "Some random text"; 

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

    text_check_h = bounds.height(); 
    text_check_w = bounds.width(); 
    incr_text_size++; 

if (text_height == text_check_h && text_width == text_check_w){ 
found_desired_size = false; 
} 
} 
return incr_text_size; // this will be desired text size from bounds you already have 

// Этот метод может быть немного изменен, но дает вам представление о том, что вы можете сделать.

+2

Это не совсем то, что я хочу. Мне не нужно вычислять высоту/ширину текста в соответствии с размером текста и шрифтом. Мне нужно рассчитать размер текста в соответствии с высотой/шириной и шрифтом. – kankan

+0

@kankan: didi вы получите ответ? – DKV

26

Это должно быть простое решение:

public void correctWidth(TextView textView, int desiredWidth) 
{ 
    Paint paint = new Paint(); 
    Rect bounds = new Rect(); 

    paint.setTypeface(textView.getTypeface()); 
    float textSize = textView.getTextSize(); 
    paint.setTextSize(textSize); 
    String text = textView.getText().toString(); 
    paint.getTextBounds(text, 0, text.length(), bounds); 

    while (bounds.width() > desiredWidth) 
    { 
     textSize--; 
     paint.setTextSize(textSize); 
     paint.getTextBounds(text, 0, text.length(), bounds); 
    } 

    textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize); 
} 
+0

Это должно быть решение. – Claud

+0

Лучшее и легкое решение. Благодаря! –

2

Мне также приходилось сталкиваться с той же проблемой, когда необходимо обеспечить, чтобы текст вписывался в конкретный блок. Ниже это самый эффективный и наиболее точное решение, которое я для него в данный момент:

/** 
* A paint that has utilities dealing with painting text. 
* @author <a href="maillto:nospam">Ben Barkay</a> 
* @version 10, Aug 2014 
*/ 
public class TextPaint extends android.text.TextPaint { 
    /** 
    * Constructs a new {@code TextPaint}. 
    */ 
    public TextPaint() { 
     super(); 
    } 

    /** 
    * Constructs a new {@code TextPaint} using the specified flags 
    * @param flags 
    */ 
    public TextPaint(int flags) { 
     super(flags); 
    } 

    /** 
    * Creates a new {@code TextPaint} copying the specified {@code source} state. 
    * @param source The source paint to copy state from. 
    */ 
    public TextPaint(Paint source) { 
     super(source); 
    } 

    // Some more utility methods... 

    /** 
    * Calibrates this paint's text-size to fit the specified text within the specified width. 
    * @param text  The text to calibrate for. 
    * @param boxWidth The width of the space in which the text has to fit. 
    */ 
    public void calibrateTextSize(String text, float boxWidth) { 
     calibrateTextSize(text, 0, Float.MAX_VALUE, boxWidth); 
    } 

    /** 
    * Calibrates this paint's text-size to fit the specified text within the specified width. 
    * @param text  The text to calibrate for. 
    * @param min  The minimum text size to use. 
    * @param max  The maximum text size to use. 
    * @param boxWidth The width of the space in which the text has to fit. 
    */ 
    public void calibrateTextSize(String text, float min, float max, float boxWidth) { 
     setTextSize(10); 
     setTextSize(Math.max(Math.min((boxWidth/measureText(text))*10, max), min)); 
    } 
} 

Это просто вычисляет правильный размер, а не выполнение теста пробы/ошибку.

Вы можете использовать его как это:

float availableWidth = ...; // use your text view's width, or any other width. 
String text = "Hi there"; 
TextPaint paint = new TextPaint(Paint.ANTI_ALIAS_FLAG); 
paint.setTypeface(...); 
paint.calibrateTextSize(text, availableWidth); 

Или иначе, если вы хотите, чтобы доставить мусор:

/** 
* Calibrates this paint's text-size to fit the specified text within the specified width. 
* @param paint  The paint to calibrate. 
* @param text  The text to calibrate for. 
* @param min  The minimum text size to use. 
* @param max  The maximum text size to use. 
* @param boxWidth The width of the space in which the text has to fit. 
*/ 
public static void calibrateTextSize(Paint paint, String text, float min, float max, float boxWidth) { 
    paint.setTextSize(10); 
    paint.setTextSize(Math.max(Math.min((boxWidth/paint.measureText(text))*10, max), min)); 
} 

Использование так:

float availableWidth = ...; // use your text view's width, or any other width. 
String text = "Hi there"; 
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); 
paint.setTypeface(...); 
calibrateTextSize(paint, text, 0, Float.MAX_VALUE, availableWidth); 
3
public static float getFitTextSize(TextPaint paint, float width, String text) { 
    float nowWidth = paint.measureText(text); 
    float newSize = (float) width/nowWidth * paint.getTextSize(); 
    return newSize; 
} 
+7

Пожалуйста, объясните свой код, чтобы ваш вопрос понял ваше решение. – SuperBiasedMan

+0

Это должно быть приемлемым решением. Самый быстрый и самый простой. – AJoe16

+0

Простой и быстрый – ucMedia

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