我有一个文本应该设置为具有指定宽度的TextView。它需要计算文本大小以使其适合TextView。
换句话说:有没有办法将文本放入TextView区域,比如ImageView缩放类型功能?
答案 0 :(得分: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();
编辑(评论后): 反过来使用上面的内容:
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
//这个方法可能会稍微调整一下,但会让你知道你能做什么
答案 1 :(得分:29)
这应该是一个简单的解决方案:
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);
}
答案 2 :(得分:11)
public static float getFitTextSize(TextPaint paint, float width, String text) {
float nowWidth = paint.measureText(text);
float newSize = (float) width / nowWidth * paint.getTextSize();
return newSize;
}
答案 3 :(得分:3)
当必须确保文本适合特定的框时,我还必须面对同样的问题。以下是我目前最佳表现和最准确的解决方案:
/**
* 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);
答案 4 :(得分:1)
我需要一个能以像素为单位计算宽度和高度的最佳拟合的像素。这是我的解决方案:
private static int getFitTextSize(Paint paint, int width, int height, String text) {
int maxSizeToFitWidth = (int)((float)width / paint.measureText(text) * paint.getTextSize());
return Math.min(maxSizeToFitWidth, height);
}
答案 5 :(得分:0)
Kotlin 中的这个解决方案同时考虑了宽度增长和减少:
private fun TextView.updateTextSize(desiredTextViewWidth: Int, text: String) {
var lastFitSize = 0f
var foundMaxSize = false
while (!foundMaxSize && lastFitSize < Float.MAX_VALUE) {
paint.textSize = lastFitSize + 1
foundMaxSize = paint.measureText(text) > desiredTextViewWidth
if (!foundMaxSize) {
lastFitSize = paint.textSize
}
}
setTextSize(TypedValue.COMPLEX_UNIT_PX, lastFitSize)
}