如何在 Android 上获得字符串宽度?

如果可能的话,我也想得到高度。

78697 次浏览

可以使用 Paint 对象的 getTextBounds(String text, int start, int end, Rect bounds)方法。您可以使用 TextView提供的油漆对象,也可以使用所需的文本外观自己构建一个。

使用 Textview 你可以做到以下几点:

Rect bounds = new Rect();
Paint textPaint = textView.getPaint();
textPaint.getTextBounds(text, 0, text.length(), bounds);
int height = bounds.height();
int width = bounds.width();

如果你只是需要宽度,你可以使用:

float width = paint.measureText(string);

Http://developer.android.com/reference/android/graphics/paint.html#measuretext (java.lang. String)

文本有两种不同的宽度度量。一个是已经在宽度中绘制的像素数,另一个是在绘制文本之后光标应该提前的“像素”数。

MesureText Paint.getTextWidths返回在绘制给定字符串之后游标应该向前移动的像素数(浮点数)。对于绘制的像素数,按照其他答案中提到的那样使用 Paint.getTextBound。我相信这就是所谓的“前进”的字体。

对于一些字体,这两个尺寸不同(很多) ,例如字体 黑人大法官有字母延伸超过其他字母(重叠)-见大写字母“ L”。使用其他答案中提到的 Paint.getTextBounds来绘制像素。

我是这样测量宽度的:

String str ="Hiren Patel";


Paint paint = new Paint();
paint.setTextSize(20);
Typeface typeface = Typeface.createFromAsset(getAssets(), "Helvetica.ttf");
paint.setTypeface(typeface);
paint.setColor(Color.BLACK);
paint.setStyle(Paint.Style.FILL);
Rect result = new Rect();
paint.getTextBounds(str, 0, str.length(), result);


Log.i("Text dimensions", "Width: "+result.width());

This would help you.

最有可能的情况是,您想知道具有给定字体的给定文本字符串的绘制尺寸(即特定的 Typeface,例如具有 BOLD _ ITALIC 样式的“ sans-serif”字体族,以及特定大小(sp 或 px))。

比起充满一个完整的 TextView,你可以更低层次的使用一个 Paint对象直接处理 单线文本,例如:

// Maybe you want to construct a (possibly static) member for repeated computations
Paint paint = new Paint();


// You can load a font family from an asset, and then pick a specific style:
//Typeface plain = Typeface.createFromAsset(assetManager, pathToFont);
//Typeface bold = Typeface.create(plain, Typeface.DEFAULT_BOLD);
// Or just reference a system font:
paint.setTypeface(Typeface.create("sans-serif",Typeface.BOLD));


// Don't forget to specify your target font size. You can load from a resource:
//float scaledSizeInPixels = context.getResources().getDimensionPixelSize(R.dimen.mediumFontSize);
// Or just compute it fully in code:
int spSize = 18;
float scaledSizeInPixels = TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_SP,
spSize,
context.getResources().getDisplayMetrics());
paint.setTextSize(scaledSizeInPixels);


// Now compute!
Rect bounds = new Rect();
String myString = "Some string to measure";
paint.getTextBounds(myString, 0, myString.length(), bounds);
Log.d(TAG, "width: " + bounds.width() + " height: " + bounds.height());

对于 多行或跨行文本(SpannedString) ,可以考虑使用 StaticLayout,其中提供宽度并导出高度。有关在自定义视图中测量文本并将文本绘制到画布的详细答案,请参阅: https://stackoverflow.com/a/41779935/954643

同样值得注意的是@arberg 在下面关于像素绘制和提前宽度(“在绘制给定字符串之后光标应该提前的像素数(浮点数)”)的回复,以防您需要处理这个问题。

我想分享一个更好的方法 (比目前公认的答案更通用)获得精确的宽度绘制的文本(String)与使用静态类 StaticLayout:

StaticLayout.getDesiredWidth(text, textPaint))

这种方法比 textView.getTextBounds()更精确,因为您可以计算多行 TextView中单行的宽度,或者您可能不会首先使用 TextView(例如在自定义 View实现中)。

这种方法类似于 textPaint.measureText(text),但是在少数情况下似乎更准确。

我把最大的角色钉在线上,用最大的空间反抗它,创建新的线条

    v_y = v_y + 30;
String tx = "مبلغ وقدرة : "+ AmountChar+" لا غير";


myPaint.setTextAlign(Paint.Align.RIGHT);


int pxx = 400;
int pxy = v_y ;
int word_no = 1;
int word_lng = 0;
int max_word_lng = 45;
int new_line = 0;
int txt_lng = tx.length();
int words_lng =0;
String word_in_line = "" ;
for (String line : tx.split(" "))
{
word_lng = line.length() ;
words_lng += line.length() + 1;


if (word_no == 1 )
{word_in_line = line;
word_no += 1;
}
else
{ word_in_line += " " + line;
word_no += 1;
}


if (word_in_line.length() >= max_word_lng)
{
canvas.drawText(word_in_line, pxx, pxy, myPaint);
new_line += 1;
pxy = pxy + 30;
word_no = 1;
word_in_line = "";
}
if (txt_lng <= words_lng )
{ canvas.drawText(word_in_line, pxx, pxy, myPaint); }
}


v_y = pxy;