Android: Canvas.drawText() размер текста на разных разрешениях экрана

В моей игре Android у меня есть несколько вызовов Canvas.drawText().

Для тестирования я использую стандартный размер шрифта, который, кажется, работает нормально.

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

Есть ли простой способ рассчитать, какой размер должен быть нарисован в тексте или я должен сделать это вручную?

edit: Какой смысл редактировать мой пост @Suragch?

Ответ 1

Самый простой способ - определить размер шрифта в ваших ресурсах с помощью единиц не зависящих от масштаба пикселей (sp) - этот блок подобен пикселям с независимой от плотности (dp или dip), в которых требуется с учетом плотности экрана, но также учитывает настройку размера шрифта для пользователя.

Чтобы добавить новое измерение, создайте файл dimens.xml в вашей папке res/values и введите следующий код, чтобы добавить новое измерение с именем myFontSize:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="myFontSize">20sp</dimen>
</resources>

Затем вы можете получить размер текста в своем приложении, используя

int scaledSize = getResources().getDimensionPixelSize(R.dimen.myFontSize);

Результирующий размер будет правильно масштабирован, чтобы учесть текущую плотность экрана и размер шрифта.

Для получения дополнительной информации см. страницу Android Developers на Дополнительные ресурсы.

Ответ 2

Самый простой способ - определить размер шрифта в каталоге ресурсов с единицами scale-independent pixel (sp) или density-independent pixel (dp). Затем получите размер текста, используя

int scaledSize = getResources().getDimensionPixelSize(R.dimen.font_size);
mTextView.setTextSize(scaledSize);

Это масштабирует размер текста соответствующим образом в соответствии с текущей плотностью/разрешением экрана и настройкой размера шрифта пользователя.

Как определить размер шрифта в каталоге ресурсов?

Создайте файл с именем dimens.xml в папке res->values. Затем скопируйте следующий код.

<resources>
    <dimen name="font_size">25sp</dimen>   // sp or dp accordingly
</resources>

Атрибут name тега <dimen> будет использоваться как идентификатор ресурса.

Ответ 3

При вызове Canvas.drawText() размер текста сначала определяется переданным в объекте Paint, который может быть установлен через Paint.setTextSize(). Размер текста автоматически масштабируется Canvas на основе плотности холста, которую можно найти с помощью Canvas.getDensity().

При настройке размера текста на объект рисования, который будет нарисован на Canvas, работайте с единичным значением dp или sp и пусть Canvas обрабатывает масштабирование для вас.

Ответ 4

Вы можете сделать это самостоятельно, используя простую математическую операцию:

Вам нужно рассчитать отношение, которое рисует ваш текст только одного размера для любого размера холста, поэтому используйте фактический размер холста, например:

double relation = Math.sqrt(canvas.getWidth() * canvas.getHeight());

Но это число слишком велико, поэтому разделите его на тот, который вам подходит, скажем 250:

relation = relation / 250;

Теперь вы можете установить размер текста следующим образом:

paint.setTextSize((float) (myFontSize * relation));

У вас нет необходимости в соотношении деления на любое число, но в этом случае вам придется использовать очень маленькие размеры шрифта для переменной myFontSize. Для меня 250 прекрасно работает, чтобы использовать регулярные размеры шрифта, которые будут подстраиваться под любой размер экрана, так как вы уже учитываете размер пикселей из вашего холста.