Android: Paint.breakText() неточен?

У меня есть представление, которое рисует прямоугольник со строкой текста внутри него. Представление использует разрыв текста, чтобы текст не выходил за пределы прямоугольника; он игнорирует любой текст, который делает. Это прекрасно работает для некоторых символов, но часто строки, состоящие из 'l' и 'f', выходят за пределы прямоугольника. Итак, мне нужна проверка работоспособности здесь: есть ли какой-то очевидный недостаток в моем приведенном ниже коде или возможно, что Paint.breakText(...) неточен?

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

person ab11    schedule 25.02.2011    source источник


Ответы (2)


Это было исправлено: Paint.setSubpixelText(true);

person ab11    schedule 01.03.2011

Проблема может заключаться в том, как вы рисуете свой прямоугольник. Штрихи не снаружи прямоугольника, половина штриха внутри, половина снаружи.

person Romain Guy    schedule 25.02.2011
comment
Я сомневаюсь, что это проблема. Данный код предполагает, что весь штрих находится внутри прямоугольника (это учитывается переменными maxWidth, textX и textY). Так что, во всяком случае, текст должен сломаться раньше, чем ожидалось, но никогда не должен выходить за пределы прямоугольника. - person ab11; 25.02.2011
comment
Проблема заключалась в том, что не были заданы дробные метрики (субпиксельный текст). - person ab11; 01.03.2011