developer tip

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

copycodes 2020. 8. 29. 11:23
반응형

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


가능한 한 높이도 얻고 싶습니다.


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

너비가 필요한 경우 다음을 사용할 수 있습니다.

float width = paint.measureText(string);

http://developer.android.com/reference/android/graphics/Paint.html#measureText(java.lang.String)


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

paint.measureTextpaint.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());

이것은 당신을 도울 것입니다.


대부분의 경우 주어진 글꼴 (예 : 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을 참조하십시오.

Also worth noting @arberg's reply below about the pixels painted vs the advance width ("number of pixels (in float) which the cursor should be advanced after drawing the given string"), in case you need to deal with that.


I'd like to share a better way (more versatile then the current accepted answer) of getting the exact width of a drawn text (String) with the use of static class StaticLayout:

StaticLayout.getDesiredWidth(text, textPaint))

this method is more accurate than textView.getTextBounds(), since you can calculate width of a single line in a multiline TextView, or you might not use TextView to begin with (for example in a custom View implementation).

This way is similar to textPaint.measureText(text), however it seems to be more accurate in rare cases.

참고URL : https://stackoverflow.com/questions/3630086/how-to-get-string-width-on-android

반응형