Размеры текста в канвасе
от Ксакеп
Если вы рисуете графику прямо в Canvas'е, то рано или поздно вам захочется выводить на экран и текст. Для этого вам нужно знать, как он будет располагаться, соответственно потребуется рассчитать его ширину/высоту для выравнивания и прочих эффектных штук.
Недавно в своём приложении мне также понадобилось вертикальное и горизонтальное центрирование. Поэтому я начал со следующего кода:
Я не ожидал, что это сработает как надо (привычная ситуация), и вышло что-то в таком роде:
У нас есть метод!!
Тогда я попытался вычислить размеры текста и изменить координаты X, Y следующим образом:
Гораздо лучше, но всё ещё остался небольшой дефект, приглядитесь:
Чтобы убедиться, что с моими глазами всё в порядке, я добавил отображение прямоугольника, полученного с помощью метода Paint.getTextBounds().
Как можно видеть, текст чуть-чуть выходит за границы.
Ещё один метод
Именно в этот момент я заметил, что в классе Paint определён ещё один метод для вычисления ширины текста: Paint.measureText()
Он вычисляет только ширину, а не высоту, поэтому я попытался скомбинировать два метода:
И получаем идеально центрированный текст! Фуф.
Автор: Chris Banes
Если вы рисуете графику прямо в Canvas'е, то рано или поздно вам захочется выводить на экран и текст. Для этого вам нужно знать, как он будет располагаться, соответственно потребуется рассчитать его ширину/высоту для выравнивания и прочих эффектных штук.
Недавно в своём приложении мне также понадобилось вертикальное и горизонтальное центрирование. Поэтому я начал со следующего кода:
- Paint mTextPaint = new Paint();
- mTextPaint.setTextAlign(Paint.Align.CENTER); // Включим центрирование
- // И когда происходит отрисовка...
- canvas.drawText(mText,
- mBounds.centerX(), // mBounds — некая область канваса
- mBounds.centerY(), // X, Y — центр области
- mTextPaint
- );
Я не ожидал, что это сработает как надо (привычная ситуация), и вышло что-то в таком роде:
У нас есть метод!!
Тогда я попытался вычислить размеры текста и изменить координаты X, Y следующим образом:
- int mTextWidth, mTextHeight;
- Paint mTextPaint = new Paint();
- // Вычислим размеры текста
- Rect textBounds = new Rect();
- mTextPaint.getTextBounds(mText, 0, mText.length(), textBounds);
- mTextWidth = textBounds.width();
- mTextHeight = textBounds.height();
- canvas.drawText(mText,
- mBounds.centerX() - (mTextWidth / 2f),
- mBounds.centerY() + (mTextHeight / 2f),
- mTextPaint
- );
Гораздо лучше, но всё ещё остался небольшой дефект, приглядитесь:
Чтобы убедиться, что с моими глазами всё в порядке, я добавил отображение прямоугольника, полученного с помощью метода Paint.getTextBounds().
Как можно видеть, текст чуть-чуть выходит за границы.
Ещё один метод
Именно в этот момент я заметил, что в классе Paint определён ещё один метод для вычисления ширины текста: Paint.measureText()
Он вычисляет только ширину, а не высоту, поэтому я попытался скомбинировать два метода:
- int mTextWidth, mTextHeight;
- Paint mTextPaint = new Paint();
- Rect textBounds = new Rect();
- mTextPaint.getTextBounds(mText, 0, mText.length(), textBounds);
- mTextWidth = mTextPaint.measureText(mText); // Используем measureText для ширины
- mTextHeight = textBounds.height(); // Возьмём высоту из getTextBounds()
- // Выводим...
- canvas.drawText(mText,
- mBounds.centerX() - (mTextWidth / 2f),
- mBounds.centerY() + (mTextHeight / 2f),
- mTextPaint
- );
И получаем идеально центрированный текст! Фуф.
Автор: Chris Banes