Android: Canvas.drawText() размер текста на разных разрешениях экрана
Для моей игры для Android у меня есть несколько звонков Canvas.drawText()
,
Для тестирования я использую стандартный размер шрифта, который, кажется, работает нормально.
Однако, когда я увеличиваю разрешение до более высокой плотности, автоматически загружаются большие изображения, но текст теперь невероятно мал.
Есть ли простой способ подсчитать, какой размер текста должен быть нарисован, или я должен сделать это вручную?
редактировать: какой смысл редактировать мой пост @Suragch?
4 ответа
Самый простой способ - определить размеры шрифта в ресурсах с помощью единиц измерения, не зависящих от масштаба (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 на Дополнительные ресурсы.
Вы можете сделать это самостоятельно, используя простую математическую операцию:
Вам нужно вычислить отношение, которое рисует ваш текст одинакового размера для любого размера холста, поэтому используйте фактический размер холста, например так:
double relation = Math.sqrt(canvas.getWidth() * canvas.getHeight());
Но это число слишком велико, поэтому разделите его на число, которое соответствует вашим потребностям, скажем, 250:
relation = relation / 250;
Теперь вы можете установить свой размер текста следующим образом:
paint.setTextSize((float) (myFontSize * relation));
Вам не нужно делить отношение на любое число, но в этом случае вам придется использовать очень маленький размер шрифта для переменной myFontSize
, Для меня 250 прекрасно работает, используя обычные размеры шрифта, которые будут подстраиваться под любой размер экрана, так как вы уже учитываете размеры в пикселях вашего холста.
Самый простой способ - определить размер шрифта в каталоге ресурсов с единицами измерения: 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>
будет использоваться в качестве идентификатора ресурса.
При звонке Canvas.drawText()
размер текста сначала определяется переданным в Paint
объект, который можно установить через Paint.setTextSize()
, Размер текста автоматически масштабируется Canvas
на основе плотности холста, которая может быть найдена с помощью Canvas.getDensity()
,
При настройке размера текста для объекта рисования, который будет отображаться в Canvas, используйте значение единицы dp
или же sp
и пусть Canvas справится с масштабированием для вас.