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


Answers:


201

您可以使用getTextBounds(String text, int start, int end, Rect bounds)Paint对象的方法。您可以使用a提供的绘画对象,也可以使用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();

5
@Frank:如果字符串是跨度字符串怎么办?
Ashwin

好答案。顺便说一句,如果call,结果将更加准确textView.setTextSize()
li2 2015年


19

文本有两种不同的宽度度量。一个是在宽度上绘制的像素数,另一个是在绘制文本后光标应前进的“像素”数。

paint.measureTextpaint.getTextWidths返回绘制给定字符串后光标应前进的像素数(浮点数)。对于绘制的像素数,请使用其他答案中提到的paint.getTextBounds。我相信这称为字体的“高级”。

对于某些字体,这两个度量值会有所不同(alot),例如,Black Chancery字体的字母延伸超过其他字母(重叠)-参见大写字母“ L”。使用其他答案中提到的paint.getTextBounds来绘制像素。


6

我以这种方式测量宽度:

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

这将对您有帮助。


3

您最有可能想知道使用给定字体(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在下面关于绘制的像素与前进宽度(“绘制给定字符串后光标应前进的像素数(浮点数)”)的答复,以防您需要处理。


2

我想分享一种更好的方法(比当前接受的答案更具通用性String),使用静态类来获取绘制的文本()的确切宽度StaticLayout

StaticLayout.getDesiredWidth(text, textPaint))

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

这种方式与相似textPaint.measureText(text),但是在极少数情况下似乎更准确。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.