วิธีรับความกว้างสตริงบน Android


คำตอบ:


202

คุณสามารถใช้getTextBounds(String text, int start, int end, Rect bounds)วิธีการของวัตถุระบายสี คุณสามารถใช้วัตถุสีที่ให้มาโดยไฟล์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: จะเกิดอะไรขึ้นถ้า String เป็นสตริงที่ขยาย
Ashwin

คำตอบที่ดี textView.setTextSize()โดยวิธีการที่ผลที่ได้จะมีความแม่นยำมากขึ้นถ้าโทร
li2

81

หากคุณต้องการความกว้างคุณสามารถใช้ได้:

float width = paint.measureText(string);

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


4
นอกจากนี้หากคุณต้องการวัดข้อความในขนาดตัวอักษรที่แน่นอนคุณสามารถTextPaint paint = new TextPaint(); paint.setTextSize(textSize);ใช้ได้ textSizeเป็นพิกเซล
Nathan Reline

และสำหรับความสูง?
เจ้าชาย

19

มีการวัดความกว้างที่แตกต่างกันสองแบบสำหรับข้อความ หนึ่งคือจำนวนพิกเซลที่วาดตามความกว้างอีกอันคือจำนวน "พิกเซล" ที่เคอร์เซอร์ควรจะอยู่ในขั้นสูงหลังจากวาดข้อความ

paint.measureTextและpaint.getTextWidthsจะส่งคืนจำนวนพิกเซล (ใน float) ซึ่งเคอร์เซอร์ควรจะเป็นขั้นสูงหลังจากวาดสตริงที่กำหนด สำหรับจำนวนพิกเซลที่ทาสีให้ใช้ paint.getTextBounds ตามที่กล่าวไว้ในคำตอบอื่น ๆ ฉันเชื่อว่าสิ่งนี้เรียกว่า 'ขั้นสูง' ของแบบอักษร

สำหรับแบบอักษรบางแบบการวัดทั้งสองนี้แตกต่างกัน (มาก) ตัวอย่างเช่นแบบอักษร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เช่นตระกูลแบบอักษร "sans-serif" ที่มีรูปแบบ BOLD_ITALIC และขนาดเฉพาะใน 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) ให้พิจารณาใช้ a StaticLayoutซึ่งคุณระบุความกว้างและรับความสูง สำหรับคำตอบที่ละเอียดมากเกี่ยวกับการวัดและการวาดข้อความลงบนผืนผ้าใบในมุมมองที่กำหนดเองโปรดดูที่: https://stackoverflow.com/a/41779935/954643

นอกจากนี้ยังควรสังเกตคำตอบของ @ arberg ด้านล่างเกี่ยวกับพิกเซลที่ทาสีเทียบกับความกว้างล่วงหน้า ("จำนวนพิกเซล (ลอย) ซึ่งเคอร์เซอร์ควรเป็นขั้นสูงหลังจากวาดสตริงที่กำหนด") ในกรณีที่คุณต้องจัดการกับสิ่งนั้น


2

ฉันต้องการแบ่งปันวิธีที่ดีกว่า(หลากหลายกว่าคำตอบที่ยอมรับในปัจจุบัน)ในการรับความกว้างที่แน่นอนของข้อความที่วาด ( String) ด้วยการใช้คลาสแบบคงที่StaticLayout:

StaticLayout.getDesiredWidth(text, textPaint))

วิธีนี้มีความแม่นยำมากกว่าtextView.getTextBounds()เนื่องจากคุณสามารถคำนวณความกว้างของบรรทัดเดียวในหลายบรรทัดTextViewหรือคุณอาจไม่ใช้TextViewเพื่อเริ่มต้นด้วย (ตัวอย่างเช่นในการViewใช้งานแบบกำหนดเอง)

วิธีนี้คล้ายกับtextPaint.measureText(text)แต่ดูเหมือนว่าจะแม่นยำกว่าในบางกรณี

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.