Как точно измерить размер в пикселях текста, рисуемого на холсте, методом drawTextOnPath () - PullRequest
4 голосов
/ 09 января 2011

Я использую drawTextOnPath () для отображения некоторого текста на холсте, и мне нужно знать размеры рисуемого текста.Я знаю, что это невозможно для путей, состоящих из нескольких сегментов, кривых и т. Д., Но мой путь - это один сегмент, который является абсолютно горизонтальным.Я использую Paint.getTextBounds (), чтобы получить Rect с размерами текста, который я хочу нарисовать.

Я использую этот прямоугольник для рисования ограничивающего прямоугольника вокруг текста, когда я рисую его в произвольном месте.

Вот несколько упрощенных кодов, которые отражают то, что я в данный момент делаю:

// to keep this example simple, always at origin (0,0)
public drawBoundedText(Canvas canvas, String text, Paint paint) {
    Rect textDims = new Rect();
    paint.getTextBounds(text,0, text.length(), textDims);
    float hOffset = 0;
    float vOffset = paint.getFontMetrics().descent;  // vertically centers text 
    float startX = textDims.left;  / 0
    float startY = textDims.bottom;
    float endX = textDims.right;
    float endY = textDims.bottom;

    path.moveTo(startX, startY);
    path.lineTo(endX, endY);
    path.close();

    // draw the text
    canvas.drawTextOnPath(text, path, 0, vOffset, paint);

    // draw bounding box
    canvas.drawRect(textDims, paint);
}

Результаты - близкие, но не идеальные.Если я заменил вторую на последнюю строку:

canvas.drawText(text, startX, startY - vOffset, paint);

, тогда это работает отлично.Обычно на правом и нижнем краях имеется промежуток в 1-3 пикселя.Кажется, ошибка также зависит от размера шрифта.Есть идеи?Возможно, я все делаю правильно, и проблема в drawTextOnPath ();качество текста очень заметно ухудшается при рисовании вдоль путей, даже если путь горизонтальный, вероятно, из-за алгоритма интерполяции или какого-либо его использования за кулисами.Я не удивлюсь, узнав, что джиттер размера также исходит оттуда.

1 Ответ

0 голосов
/ 10 января 2011

Я нашел решение, которое подходит для моей конкретной ситуации, хотя на самом деле не решает первоначальный вопрос.

Так как мой конкретный вариант использования рисует текст только по прямолинейным путям одного сегмента, я смог избавиться от путей вместе и использовать Canvas.drawText () вместе с Canvas.translate () и canvas.rotate (). Это избавило от случайности и уродства размера текста, которые я видел, когда рисовал вдоль путей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...