2012-02-20 20 views
8

पर टेक्स्ट ऊंचाई को मापें मैं वर्तमान में बिटमैप को प्रस्तुत करने पर काम कर रहा हूं, कि मैं फिर मोबाइल प्रिंटर को भेजना चाहता हूं। हालांकि, मैं अपने पाठ की ऊंचाई को मापने के लिए संघर्ष कर रहा हूं, इसलिए मैं वाई स्थिति को उचित रूप से अग्रिम कर सकता हूं।एंड्रॉइड: कैनवास

मेरे बुनियादी बिटमैप/कैनवास/रंग विन्यास इस (अक्षरों का आकार 16 है और बिटमैप के आयामों 200x400 हैं (चौड़ाई x ऊँचाई):

public MyRenderer() { 
    // Initialize bitmap 
    bitmap = Bitmap.createBitmap(200, 400, Bitmap.Config.ARGB_8888); 

    // Initialize canvas 
    canvas = new Canvas(bitmap); 

    // Initialize brush (Paint instance) 
    brush = new Paint(); 
    brush.setTextSize(16); 
    brush.setTypeface(Typeface.SANS_SERIF); 
    brush.setColor(Color.BLACK); 
    brush.setStyle(Paint.Style.FILL); 
    brush.setAntiAlias(true); 
    brush.setTextAlign(Align.LEFT); 
} 

अब तक तो अच्छा, अब मैं क्या करना चाहते हैं ऐसा करें: अगर मैं पेंट की विधि ड्रॉटेक्स्ट का उपयोग करता हूं तो मुझे एक्स और वाई निर्देशांक की आपूर्ति करने की आवश्यकता होती है। एक्स के लिए शून्य (बाएं संरेखित पाठ को मानते हुए) के रूप में, लेकिन वाई के लिए, मुझे प्रिंट करने वाले प्रत्येक पाठ की ऊंचाई की गणना करना होगा और इसे जोड़ें, इसलिए मैं अपने वर्तमान वाई स्थिति का ट्रैक रख सकता हूं।

और यह वह जगह है जहां यह विषम हो जाता है: मैं पाठ की ऊंचाई निर्धारित करने के लिए निम्न विधि का उपयोग कर रहा हूं (पाई का उपयोग करके NT आपत्ति की है कि मैं पहले से प्रारंभ - यह "ब्रश") कहा जाता है:

public int measureHeight(String text) { 
    Rect result = new Rect(); 
    // Measure the text rectangle to get the height 
    brush.getTextBounds(text, 0, text.length(), result); 
    return result.height(); 
} 

उपरोक्त विधि निम्नलिखित ग्रंथों के लिए निम्न मान देता है:

  1. "नमस्ते विश्व" की ऊंचाई देता है 12
  2. "3 डी रूपांतरणों की गणना करने और मैट्रिक्स उत्पन्न करने के लिए एक कैमरा उदाहरण का उपयोग किया जा सकता है। "की ऊंचाई देता है 16
  3. " एंड्रॉइड डिज़ाइन पेश करना: विश्व स्तरीय एंड्रॉइड उपयोगकर्ता इंटरफेस बनाने के लिए सिद्धांतों, बिल्डिंग ब्लॉक और पैटर्न के बारे में जानने के लिए जगह। चाहे आप यूआई पेशेवर हों या डेवलपर उस भूमिका निभा रहे हों, ये दस्तावेज़ आपको दिखाएंगे कि बड़े डिजाइन छोटे, छोटे और छोटे कैसे करें। "

यह मेरे लिए समझ में आता है की ऊंचाई, उस नंबर 2 और 3 वापसी संख्या 1 से लेकिन एक बड़ा ऊंचाई देता है एक पंक्ति में 12 की ऊंचाई है, तो (संख्या के रूप में एक करता है) - यह कोई समझ नहीं आता है कि कई लाइनों की ऊंचाई 16 है?

क्या मुझे यहां कुछ याद आ रही है? पाठ की चौड़ाई को मापने के लिए एक सुविधाजनक तरीका है (पेंट और कॉल मापन टेक्स्ट ("myText") का उदाहरण उपयोग करके पूरी तरह से काम करता है, हालांकि जब मैं ऊंचाई की बात करता हूं, तो मुझे काफी नुकसान होता है, क्योंकि ऊपर दिए गए परिणामों से मुझे कोई समझ नहीं आती है।

संपादित

मैं, पता है कि getTextBounds शायद करता है बहु लाइन पाठ का कोई ऑटो रैपिंग, और कहा कि ठीक है, मैं पहले से ही लिखा था बंटवारे पाठ के लिए एक विधि है, लेकिन यह सिर्फ एक रेखा से ऊपर उपायों भले ही, दिए गए लंबाई मान अभी भी असंभव प्रतीत होते हैं।

उत्तर

16

मुझे लगता है कि ऐसा इसलिए है क्योंकि "गणना" में "पी" बेसलाइन के नीचे फैली हुई है जबकि "हैलो वर्ल्ड" में केवल आधार हैं जो आधार रेखा से ऊपर हैं।

चूंकि लाइन दूरी आपके टेक्स्ट में होने वाले विशिष्ट अक्षरों पर निर्भर नहीं होनी चाहिए, शायद Paint.FontMetrics की तलाश कर रहे हैं जिन्हें Paint.getFontMetrics() के माध्यम से प्राप्त किया जा सकता है। अनुशंसित बेसलाइन दूरी प्राप्त करने के लिए descent - ascent + leading गणना करें (क्योंकि चढ़ाई का नकारात्मक मान है)।

+0

मैं आधारभूत दूरी दिया ग्रंथों ऊपर उन तीन के लिए गणना (अपने गणना के अनुसार) है, यह हमेशा रिटर्न 19. चाहेंगे इसका मतलब है, अगर मैं 1 9 लेता हूं तो ऊंचाई है, फिर भी अगली पंक्ति के लिए मौजूदा लाइन के साथ ओवरलैप नहीं होने के लिए पर्याप्त जगह होगी? अग्रिम बहुत बहुत धन्यवाद! – AgentKnopf

+0

यह फ़ॉन्ट की एक विशेषता है, आपको अलग-अलग ग्रंथों के लिए इसे बार-बार गणना करने की आवश्यकता नहीं है। आप चाहते हैं कि दूरी हमेशा एक जैसी हो, भले ही आपके पाठ में कौन से पात्र हों। और हाँ, लाइनें ओवरलैप नहीं होंगे। – devconsole

+0

बहुत बहुत धन्यवाद - मैंने जो किया और मेरे बिटमैप को प्रस्तुत करना अभी ठीक है :)। मैं MyRenderer के निर्माता में एक बार "रेखा ऊंचाई" शुरू करता हूं। – AgentKnopf

4

स्वीकृत उत्तर में एक छोटी सी त्रुटि है। आप पाठ ऊंचाई चाहते हैं, आप

Paint.FontMetrics fm = mTextPaint.getFontMetrics(); 
float textHeight = fm.descent - fm.ascent; 

का उपयोग करना चाहिए और अगर आप लाइन ऊंचाई चाहते हैं, आप

float lineHeight = fm.bottom - fm.top + fm.leading; 

का उपयोग करना चाहिए वैकल्पिक अस्तर रिक्ति है अग्रणी, इसलिए यदि आप करने की आवश्यकता है लाइन हाइट प्राप्त करें जिसमें आप इसे शामिल कर सकते हैं। लेकिन अगर आप सिर्फ टेक्स्ट ऊंचाई चाहते हैं, तो आप इसे छोड़ सकते हैं।

नोट

  • मैं वास्तव में कभी नहीं देखा है leading कुछ और हो 0 से, और जहाँ तक मैं बता सकता है तो यह और भी TextView source code में नजरअंदाज किया जा रहा है (और इससे संबंधित Layout, StaticLayout, आदि।)। कृपया मुझे सुधारें अगर मैं गलत हूं। तो यह शायद सुरक्षित है, इसे लाइन हाइट कैल्यूलेशन से बाहर छोड़ दें, लेकिन मुझे इसके बारे में पूरी तरह से यकीन नहीं है।

भी देखें