एंड्रॉइड पर स्ट्रिंग चौड़ाई कैसे प्राप्त करें?


जवाबों:


202

आप getTextBounds(String text, int start, int end, Rect bounds)किसी पेंट ऑब्जेक्ट की विधि का उपयोग कर सकते हैं । आप या तो आपके द्वारा प्रदत्त पेंट ऑब्जेक्ट का उपयोग कर सकते हैं या 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
@ फ्रेंक: क्या होगा अगर स्ट्रिंग एक स्पंजी स्ट्रिंग है?
अश्विन

बहुत बढ़िया जवाब। वैसे, कॉल होने पर परिणाम अधिक सटीक होगा textView.setTextSize()
li2 14

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पिक्सल में है।
नाथन रिलीफ

और ऊंचाई पाने के लिए?
प्रिंस

19

एक पाठ के लिए दो अलग-अलग चौड़ाई के उपाय हैं। एक पिक्सेल की संख्या है जिसे चौड़ाई में खींचा गया है, दूसरा है 'पिक्सल' की संख्या जो कर्सर को पाठ खींचने के बाद उन्नत किया जाना चाहिए।

paint.measureText और paint.getTextWidths पिक्सल की संख्या (फ्लोट में) लौटाता है जिसे कर्सर को दिए गए स्ट्रिंग को खींचने के बाद उन्नत किया जाना चाहिए। जैसा कि अन्य उत्तर में उल्लेख किया गया है, पेंट किए गए पिक्सेल रंग की संख्या का उपयोग करें। मेरा मानना ​​है कि इसे फॉन्ट का 'एडवांस' कहा जाता है।

कुछ फोंट के लिए ये दोनों माप अलग-अलग (एक जैसे) होते हैं, उदाहरण के लिए फॉन्ट ब्लैक चांसरी में ऐसे अक्षर होते हैं जो अन्य अक्षरों (ओवरलैपिंग) को बढ़ाते हैं - राजधानी 'एल' देखें। पिक्सेल का रंग पाने के लिए अन्य उत्तर में बताए अनुसार 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), एक प्रयोग करने पर विचार StaticLayoutजिसमें आप चौड़ाई प्रदान करते हैं और ऊंचाई निकाले जाते हैं,। एक कस्टम दृश्य में कैनवास पर टेक्स्ट को मापने और आरेखित करने पर बहुत विस्तृत उत्तर के लिए, देखें: https://stackoverflow.com/a/41779935/954643

इसके अलावा @ arberg के जवाब में पिक्सेल के बारे में नीचे दी गई अग्रिम चौड़ाई ("फ्लोट में पिक्सेल की संख्या) जो दी गई स्ट्रिंग को खींचने के बाद कर्सर को उन्नत किया जाना चाहिए"), अगर आपको उससे निपटने की आवश्यकता है।


2

मैं एक स्थिर पाठ के उपयोग के साथ एक बेहतर पाठ ( ) की सटीक चौड़ाई प्राप्त करने का एक बेहतर तरीका (अधिक बहुमुखी तो वर्तमान स्वीकृत उत्तर) साझा करना चाहता हूं :StringStaticLayout

StaticLayout.getDesiredWidth(text, textPaint))

यह विधि से अधिक सटीक है textView.getTextBounds(), क्योंकि आप एक बहु-रेखा में एक पंक्ति की चौड़ाई की गणना कर सकते हैं TextView, या आप TextView(उदाहरण के लिए एक कस्टम Viewकार्यान्वयन में) के साथ शुरू करने के लिए उपयोग नहीं कर सकते हैं ।

यह तरीका समान है textPaint.measureText(text), हालांकि यह दुर्लभ मामलों में अधिक सटीक लगता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.