Android에서 문자열 너비를 얻는 방법은 무엇입니까?


답변:


201

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

5
@Frank : 문자열이 스팬 문자열이면 어떨까요?
Ashwin

좋은 대답입니다. 그런데을 호출하면 결과가 더 정확 해집니다 textView.setTextSize().
li2


19

텍스트에는 두 가지 너비 측정이 있습니다. 하나는 너비에 그려진 픽셀 수이고 다른 하나는 텍스트를 그린 후 커서가 앞으로 나아가 야하는 '픽셀'수입니다.

paint.measureTextpaint.getTextWidths 는 주어진 문자열을 그린 후 커서가 이동해야하는 픽셀 수 (float)를 리턴합니다. 페인트 된 픽셀 수는 다른 답변에서 언급 한대로 paint.getTextBounds를 사용하십시오. 나는 이것을 글꼴의 'Advance'라고 생각합니다.

일부 글꼴의 경우이 두 측정치가 다릅니다 (많음). 예를 들어 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

대부분의 경우 주어진 글꼴 (예 : TypefaceBOLD_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

정적 클래스를 사용 하여 그려진 텍스트 ( ) 의 정확한 너비를 얻는 더 나은 방법 (현재 허용되는 대답보다 더 다양 함) 을 공유하고 싶습니다 .StringStaticLayout

StaticLayout.getDesiredWidth(text, textPaint))

이 방법은 여러 textView.getTextBounds()줄로 된 단일 줄의 너비를 계산할 수 TextView있거나 TextView로 시작 하는 데 사용하지 않을 수 있으므로 보다 정확 합니다 (예 : 사용자 지정 View구현).

이 방법은와 비슷 textPaint.measureText(text)하지만 드물게 더 정확한 것 같습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.