2011-02-25 21 views
5

İçinde bir metin satırıyla bir dikdörtgen çizen bir Görünüm var. Görünüm, hiçbir metnin dikdörtgenin dışında kalmamasını sağlamak için ara metni kullanır; Yaptığı herhangi bir metni yok sayar. Bu, bazı karakterler için iyi çalışır, ancak genellikle 'l'lerden ve' f'den oluşan dizgiler dikdörtgenin dışında uzanır. Yani, burada bir akıl kontrolüne ihtiyacım var: Aşağıdaki kodumda bariz kusur var mı, yoksa Paint.breakText (...) hatalı mı?Android: Paint.breakText (...) hatalı mı?

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); 
} 

cevap

10

Bu, tarafından giderildi: Paint.setSubpixelText (true);

0

Sorun, dikdörtgeni nasıl çizdiğiniz olabilir. Konturlar dikdörtgenin dışında değil, vuruşun yarısı içeride, yarısı dışarıda.

+0

Sorun bu olduğundan şüpheliyim. Verilen kod, tüm konturun dikdörtgenin içinde olduğunu varsayar (bu, "maxWidth", "textX" ve "textY" değişkenleri tarafından dikkate alınır). Yani, eğer bir şey varsa, metin beklenenden daha erken kırılmalı, ancak dikdörtgenin dışında asla uzanmamalıdır. – ab11

+0

Sorun, kesirli metriklerin (alt piksel metni) ayarlanmamış olmasıydı. – ab11