根据文本区域的宽度计算文本大小
我有一个文本应该设置为指定宽度的TextView。 它需要计算文本大小,以适应TextView。
换句话说:有没有办法将文本合并到TextView区域,比如ImageView缩放typesfunction?
如果是文本所占空间的大小,则以下内容可能会有所帮助:
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();
编辑(在评论之后):反过来使用上面的内容:
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
//这个方法可能会稍微调整一下,但是给你一个你可以做什么的想法
这应该是一个简单的解决scheme:
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); }
public static float getFitTextSize(TextPaint paint, float width, String text) { float nowWidth = paint.measureText(text); float newSize = (float) width / nowWidth * paint.getTextSize(); return newSize; }
当必须确保文本适合特定的框时,我也必须面对同样的问题。 以下是我目前所能获得的最佳performance和最准确的解决scheme:
/** * 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)); } }
这只是计算正确的大小,而不是运行试验/错误testing。
你可以像这样使用它:
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);