Я пытаюсь отобразить текст, используя код ниже. Проблема в том, что текст не центрирован по горизонтали. Когда я устанавливаю координаты дляdrawText
, он устанавливает нижнюю часть текста в этой позиции. Я хотел бы, чтобы текст был нарисован так, чтобы текст был также центрирован по горизонтали.
Это изображение, чтобы показать мою проблему дальше:
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
//canvas.drawRGB(2, 2, 200);
Paint textPaint = new Paint();
textPaint.setARGB(200, 254, 0, 0);
textPaint.setTextAlign(Align.CENTER);
textPaint.setTypeface(font);
textPaint.setTextSize(300);
canvas.drawText("Hello", canvas.getWidth()/2, canvas.getHeight()/2 , textPaint);
}
java
android
android-activity
android-canvas
drawtext
Себастьян
источник
источник
Ответы:
Попробуйте следующее:
источник
float halfLength = text.length() / 2f;
это называется продвижением типа .Paint.descent()
иPaint.ascent()
) с подходом к центру текстаPaint.getTextBounds()
в моем ответе ниже.Paint.descent()
иPaint.ascent()
не принимать во внимание фактический текст. (Вы можете распознать эту неточность на скриншоте в моем посте ниже.) Вот почему я бы рекомендовал этот подход. Подход с,Paint.getTextBounds()
кажется, работает более точным.Центрировать с помощью Paint.getTextBounds () :
Paint.Align.CENTER не означает, что исходная точка текста расположена по центру. Контрольная точка всегда находится на базовой линии. Итак, почему бы не использовать Paint.Align.LEFT ? Вы должны рассчитать контрольную точку в любом случае.
Paint.descent () имеет недостаток в том, что он не учитывает реальный текст. Paint.descent () извлекает одно и то же значение независимо от того, содержит ли текст буквы со спуском или нет. Вот почему я использую r.bottom вместо.
У меня были некоторые проблемы с Canvas.getHeight (), если API <16. Поэтому вместо этого я использую Canvas.getClipBounds (Rect) . (Не используйте Canvas.getClipBounds (). GetHeight (), так как он выделяет память для Rect .)
Из соображений производительности следует размещать объекты до того, как они будут использованы в onDraw () . Так как drawCenter () будет вызываться в onDraw (), объект Rect r предварительно выделяется здесь как поле.
Я попытался поместить код двух лучших ответов в свой собственный код (август 2015 г.) и сделал скриншот для сравнения результатов:
Текст должен быть в центре красного прямоугольника. Мой код создает белый текст, два других кода - серый текст (они на самом деле совпадают, накладываются друг на друга). Серый текст немного слишком низок, а два справа.
Вот как я сделал тест:
источник
Выравнивание по вертикали затруднено, потому что произошел спуск и всплытие текста, многие парни использовали Paint.getTextBounds (), чтобы получить TextWidth и TextHeight, но это не делает текстовый центр слишком большим. Здесь мы можем использовать Paint.measureText () для вычисления TextWidth, TextHeight, который мы просто вычитаем с опусканием и подъемом, тогда мы получили наиболее подходящий подход TextSize, следующая работа довольно проста для друг друга.
Кстати, мы настоятельно рекомендуем использовать RectF, а не Rect, потому что позиции нуждаются в более точных значениях, по моему опыту, RectF сделал верхнее и нижнее отклонение всего на один пиксель на устройстве xhdpi, Rect будет на два больше.
источник
Ваш код рисует центр базовой линии текста, в центре представления. Для того , чтобы отцентрировать текст в некоторой точке х, у, необходимо вычислить центр текста, и положить , что в точке.
Этот метод будет рисовать текст по центру в точке x, y. Если вы передадите его центру своего обзора, текст будет отцентрирован.
источник
android.graphics.Paint
что используется для рисования текстаЯ считаю, что лучшее решение для центрирования текста заключается в следующем:
источник
работает для меня, чтобы использовать: textPaint.textAlign = Paint.Align.CENTER с textPaint.getTextBounds
результат:
источник
Я создаю метод, чтобы упростить это:
rectF - это область, которую вы хотите нарисовать, вот и все. подробности
источник
Если мы используем статический макет
Layout.Alignment.ALIGN_CENTER это сделает свое дело. Статическая компоновка также имеет много других преимуществ.
Ссылка: Android Документация
источник
Это сработало для меня:
если кто-то обнаружит какие-либо проблемы, пожалуйста, дайте мне знать
источник
В моем случае мне не нужно было помещать текст в середину холста, а вращать колесо. Хотя я должен был использовать этот код для успеха:
Затем я вызываю этот метод из класса View:
источник