2010-02-25 13 views
18

पर लंबे टेक्स्ट को लपेटना मेरे पास एक कस्टम नियंत्रण है जो बहुत से 2 डी ड्राइंग को सीधे canvas पर कर रहा है।एंड्रॉइड कैनवास

इनमें से कुछ चित्र टेक्स्ट है, इसलिए मैं Canvas.drawText() विधि का उपयोग कर रहा हूं।

मैं कुछ सीमाओं के भीतर पाठ को आकर्षित करना चाहता हूं - एक शीर्ष-बाएं, निश्चित अधिकतम चौड़ाई, और अधिकतम पंक्तियां। पाठ खींचने के बाद, मैं जानना चाहता हूं कि कितनी लाइनें आईं।

क्या विभाजित रूप से विभाजित सीमाओं के भीतर पाठ खींचने के लिए एक अंतर्निहित कार्य है?

यदि नहीं, तो ऐसा करने के लिए मानक नुस्खा है?

+0

'स्टेटिकलायआउट' के एक अच्छे उपयोग उदाहरण के लिए यह उत्तर देखें: http://stackoverflow.com/a/8369690/293280 –

उत्तर

30

आप इसके लिए android.text.StaticLayout कक्षा का उपयोग कर सकते हैं; वांछित पाठ, संरेखण, चौड़ाई इत्यादि के लिए बस StaticLayout बनाएं और कैनवास को आकर्षित करने के लिए draw(Canvas) विधि को कॉल करें।

+0

आश्चर्यजनक है कि मैं इसे अनदेखा कर दूंगा – Will

+0

क्या यह केवल एंड्रॉइड के लिए है? अन्य प्लेटफार्मों के बारे में क्या? –

+0

बढ़िया! आप कैनवास में टेक्स्ट कैसे केंद्रित करेंगे? –

4

आप प्रत्येक वर्ण की चौड़ाई प्राप्त करने के लिए संपूर्ण स्ट्रिंग या पेंट.getTextWidths() के आकार को मापने के लिए Paint.getTextBounds() का उपयोग कर सकते हैं। फिर इसे खींचने से पहले स्ट्रिंग को उचित रूप से विभाजित करें।

3

मुझे एक ही समस्या थी। मेरा पहला समाधान निम्न में से एक है।

/** 
    * This function draws the text on the canvas based on the x-, y-position. 
    * If it has to break it into lines it will do it based on the max width 
    * provided. 
    * 
    * @author Alessandro Giusa 
    * @version 0.1, 14.08.2015 
    * @param canvas 
    *   canvas to draw on 
    * @param paint 
    *   paint object 
    * @param x 
    *   x position to draw on canvas 
    * @param y 
    *   start y-position to draw the text. 
    * @param maxWidth 
    *   maximal width for break line calculation 
    * @param text 
    *   text to draw 
    */ 
public static void drawTextAndBreakLine(final Canvas canvas, final Paint paint, 
     final float x, final float y, final float maxWidth, final String text) { 
    String textToDisplay = text; 
    String tempText = ""; 
    char[] chars; 
    float textHeight = paint.descent() - paint.ascent(); 
    float lastY = y; 
    int nextPos = 0; 
    int lengthBeforeBreak = textToDisplay.length(); 
    do { 
     lengthBeforeBreak = textToDisplay.length(); 
     chars = textToDisplay.toCharArray(); 
     nextPos = paint.breakText(chars, 0, chars.length, maxWidth, null); 
     tempText = textToDisplay.substring(0, nextPos); 
     textToDisplay = textToDisplay.substring(nextPos, textToDisplay.length()); 
     canvas.drawText(tempText, x, lastY, paint); 
     lastY += textHeight; 
    } while(nextPos < lengthBeforeBreak); 
} 

क्या याद आ रही है:

  • कोई बुद्धिमान ब्रेक-लाइन तंत्र है, क्योंकि यह maxWidth

कैसे कॉल करने के लिए के आधार पर टूटता?

paint.setTextSize(40); 
    paint.setColor(Color.WHITE); 
    paint.setSubpixelText(true); 
    float textHeight = paint.descent() - paint.ascent(); 
    CanvasUtils.drawTextAndBreakLine(canvas, paint, this.left, 
      textHeight, this.displayWidth, this.text); 

मेरे पास कैनवासउल्ट नामक एक स्थिर वर्ग है जहां मैं इस तरह की चीजें encapsulate। असल में मैं एक आयत के भीतर पाठ खींचता हूं। यही कारण है पाठ टेक्स्ट की ऊंचाई है। लेकिन आप जो काम करना चाहते हैं उसे पारित कर सकते हैं।

अच्छा प्रोग्रामिंग!

+0

हाँ यह मेरे लिए काम करता है लेकिन यह शब्दों को तोड़ने के लिए मजबूर करता है! क्या इसे ठीक करने का कोई रास्ता है? – Eenvincible

+0

अरे Eenvincible, आप एकल शब्द का मतलब है? हायफ़नेशन? –

+0

विशेष रूप से नहीं। इस कोड के साथ क्या होता है कि पाठ आयताकार के भीतर सही ढंग से लपेटता है लेकिन कुछ शब्दों को एक पंक्ति में दिखाए गए शब्दों और अगली पंक्ति में इसके भाग के साथ नई लाइनों में तोड़ने का अंत हो जाता है। – Eenvincible

संबंधित मुद्दे