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.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을 참조하십시오.
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
'developer tip' 카테고리의 다른 글
APNS 장치 토큰이 생성되면 변경됩니까? (0) | 2020.08.29 |
---|---|
JQuery UI 자동 완성 도우미 텍스트를 제거 / 변경하는 방법은 무엇입니까? (0) | 2020.08.29 |
탐색 창에서 선택한 메뉴 항목의 색상 변경 (0) | 2020.08.29 |
두 CGRect 비교 (0) | 2020.08.29 |
Mac 키보드를 사용하여 iPhone 시뮬레이터에서 텍스트 필드를 입력 할 수 없습니까? (0) | 2020.08.29 |