답변:
getTextBounds(String text, int start, int end, Rect bounds)
Paint 개체 의 방법을 사용할 수 있습니다 . 에서 제공하는 페인트 개체를 사용 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();
textView.setTextSize()
.
너비가 필요한 경우 다음을 사용할 수 있습니다.
float width = paint.measureText(string);
http://developer.android.com/reference/android/graphics/Paint.html#measureText(java.lang.String)
TextPaint paint = new TextPaint(); paint.setTextSize(textSize);
. textSize
픽셀 단위입니다.
텍스트에는 두 가지 너비 측정이 있습니다. 하나는 너비에 그려진 픽셀 수이고 다른 하나는 텍스트를 그린 후 커서가 앞으로 나아가 야하는 '픽셀'수입니다.
paint.measureText 및 paint.getTextWidths 는 주어진 문자열을 그린 후 커서가 이동해야하는 픽셀 수 (float)를 리턴합니다. 페인트 된 픽셀 수는 다른 답변에서 언급 한대로 paint.getTextBounds를 사용하십시오. 나는 이것을 글꼴의 'Advance'라고 생각합니다.
일부 글꼴의 경우이 두 측정치가 다릅니다 (많음). 예를 들어 Black Chancery 글꼴 에는 다른 문자를 넘어서 확장되는 문자가 있습니다 (겹침)-대문자 '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());
이것은 당신을 도울 것입니다.
대부분의 경우 주어진 글꼴 (예 : 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)
하지만 드물게 더 정확한 것 같습니다.