2011-02-25 16 views
5

मेरे पास एक दृश्य है जो इसके अंदर पाठ की एक पंक्ति के साथ एक आयत खींचता है। दृश्य यह सुनिश्चित करने के लिए ब्रेक टेक्स्ट का उपयोग करता है कि कोई पाठ आयताकार के बाहर फैला नहीं है; यह किसी भी पाठ को अनदेखा करता है जो करता है। यह कुछ पात्रों के लिए ठीक काम करता है, लेकिन अक्सर 'एल' और 'एफ' से बने स्ट्रिंग्स आयताकार के बाहर विस्तारित होते हैं। तो, मुझे यहां एक सैनिटी चेक की आवश्यकता है: क्या मेरे नीचे दिए गए कोड में कुछ स्पष्ट दोष है, या यह संभव है कि पेंट.ब्रेक्स्ट (...) गलत है?एंड्रॉइड: पेंट.ब्रेक्स्ट (...) गलत है?

public void onDraw(Canvas canvas) 
{ 
    int MARGIN = 1; 
    int BORDER_WIDTH = 1; 

    Paint p = new Paint(); 
    p.setAntiAlias(true); 
    p.setTextSize(12); 
    p.setTypeface(Typeface.create(Typeface.SERIF, Typeface.NORMAL)); 

    RectF rect = getRect(); 

    float maxWidth = rect.width() - MARGIN - BORDER_WIDTH * 2; 

    String str = getText(); 
    char[] chars = str.toCharArray(); 
    int nextPos = p.breakText(chars, 0, chars.length, maxWidth, null); 
    str = str.substring(0, nextPos); 

    float textX = MARGIN + BORDER_WIDTH; 
    float textY = (float) (Math.abs(p.getFontMetrics().ascent) + BORDER_WIDTH + MARGIN); 

    canvas.drawText(str, textX, textY, p); 

    p.setStrokeWidth(BORDER_WIDTH); 
    p.setStyle(Style.STROKE); 

    canvas.drawRect(rect, p); 
} 

उत्तर

10

यह तय किया गया था: Paint.setSubpixelText (सत्य);

0

समस्या यह हो सकती है कि आप अपना आयत कैसे आकर्षित करते हैं। स्ट्रोक आयत के बाहर नहीं हैं, स्ट्रोक का आधा अंदर है, आधा बाहर है।

+0

मुझे संदेह है कि यह मुद्दा है। दिया गया कोड मानता है कि पूरा स्ट्रोक आयताकार के अंदर है (इसे "maxWidth", "textX", और "textY" चर के साथ ध्यान में रखा जाता है)। तो, यदि कुछ भी हो, तो पाठ अपेक्षा से पहले तोड़ने की संभावना होनी चाहिए, लेकिन आयत के बाहर कभी भी विस्तार नहीं करना चाहिए। – ab11

+0

समस्या यह थी कि fractional मेट्रिक्स (उप पिक्सेल पाठ) सेट नहीं थे। – ab11

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