Як співставити розмір шрифту з роздільною здатністю екрана?


12

Тож я працюю над грою за допомогою LibGDX, і у мене є проблема.

Щоб моя гра підходила до більшості дозволів, я створив базовий актив для кожного співвідношення сторін, наприклад, фонове зображення головного меню, я створив його в 800X600 для 4: 3, 1280X720 для 16: 9 і т.д.

Зараз я намагаюся включити TextButtons у гру для варіантів; Моя проблема полягає в тому, що я не можу зрозуміти, які розміри шрифту відповідають рівним дозволам екрана. Чи є спосіб це розібратися, чи мені потрібно пройти по черзі через кожну з наявних у мене резолюцій і просто вручну підрівняти текст до резолюції?

Відповіді:


17

Це легко: шрифти не повинні відповідати роздільній здатності, вони повинні відповідати щільності пікселів .

Щільність пікселів вимірюється у вигляді пікселів на дюйм ( ІРП ) або пікселів на сантиметр. Існує також одиниця вимірювання, яка називається пікселями незалежно від щільності ( DP ) . Визначено, який 1dpрозмір має один піксель на 160 PPIекрані.

Тепер, повертаючись до шрифтів, спробуйте зробити цей тест: поставте свій ноутбук на 720p. Погляньте на розмір шрифту. Тепер підключіть його до монітора 1080p 42 "на робочому столі. Якщо ваш монітор видає потрібну інформацію про його розмір, то шрифт повинен мати ТОЧНО той самий розмір, який він мав на екрані 720p. Уявіть, наскільки дивно це було б, якби текст у вашому розмір ноутбука мав інший розмір, ніж текст на моніторі робочого столу. Зважаючи на це, більші роздільні здатності повинні надавати більше деталей шрифту, більші екрани повинні давати більше вмісту для відображення.

Той самий факт можна спостерігати і в текстових редакторах. 72ptШрифт повинен виглядати на екрані те ж саме було б при друку на папері.

Все це означає, що ви, мабуть, повинні мати однаковий розмір для всіх розмірів дисплея (за деякими винятками). Якщо ви хочете базуватися десь, веб-сайти зазвичай використовують 12ptшрифти, використовуються MS Windows 11ptта 12ptшрифти.

Ця діаграма (також включена в нижню частину відповіді) скажіть нам, що 12ptв CSS приблизно дорівнює 16pxі CSS (як би це не було досить заплутано, px у CSS такий же, як і dp скрізь), тож скажімо, що ви Я буду робити ваші шрифти 16dpна LibGDX.

У грі використовуйте FreeTypeFontGeneratorдля динамічного генерування шрифтів, таким чином ви можете враховувати щільність екрану під час їх створення:

BitmapFont createFont(FreeTypeFontGenerator ftfg, float dp)
{
    return ftfg.generateFont((int)(dp * Gdx.graphics.getDensity()));
}
//On Init
BitmapFont buttonFont = createFont(arial, 16); //16dp == 12pt

Це працює, тому що Gdx.graphics.getDensity()дорівнює YourScreenDensity/160таким чином, є "коефіцієнтом масштабу", щоб привести речі до того розміру, який вони були б на екрані 160ppi.

Про винятки, про які я згадував раніше: ви, ймовірно, хочете, щоб шрифти змінили розмір відповідно до розміру екрана у випадку логотипів, рекламних акцій тощо. Але майте на увазі, що вам буде краще робити їх у графічному редакторі, як Photoshop чи Gimp , все одно.

Інший виняток - текст на крихітних екранах. 4.5 "або менші екрани телефону, носяться. Зазвичай у вас не буде часу на прокручування контенту, або ви просто не зможете дозволити собі розмістити стільки вмісту на цьому екрані. Ви можете спробувати 1dpзменшити шрифт , як Мабуть, читач буде мати телефон дуже близько до їх обличчя, вони, ймовірно, не матимуть проблем із читанням. Майте на увазі, що ви можете дратувати гравця, читаючи нечитабельний маленький текст.

TL; DR:

  • Фізичний розмір приблизно не зміниться безпосередньо з розміром екрана або роздільною здатністю, але при комбінації обох ( screenSize/resolutionзнаменитий ІЦВ)
  • Подумайте про pt та dp . Забудьте про пікселі екрану, поки вам не доведеться отримати остаточний результат.
  • Створіть свій шрифт під час виконання з розумним розміром.
  • Перетворення dp в пікселі екрану:pixels = dp * Gdx.graphics.getDensity();
  • Якщо ви використовуєте двигун, який не дає вам конвертер в dp, як LibGDX Gdx.graphics.getDensity(), ви можете спробувати:, densityFactor = Screen.getPixelsPerInch() / 160.0fтодіpixels = dp * densityFactor

Редагувати:

2014, 25 червня в Google IO, Matias оголосив про нові вказівки щодо стилів для Android, до них входять нові вказівки щодо шрифту та типографії для Roboto. Візьміть цю таблицю як керівництво:

Настанови щодо розміру шрифтів Android, прийняті на google.com/design

EDIT2:

Додано діаграму розміру шрифту CSS, якщо посилання загниває: Розміри шрифту CSS


1
+1, чудова відповідь. Відстань перегляду також є дуже важливим фактором. Вам знадобляться більші шрифти для ігор, які працюють на консолі / телевізорі порівняно з тими для ПК або навіть планшетного ПК (де відстань перегляду досить коротка).
bummzack

1
@bummzack чудово, що ти це вказав! Ви можете досягти цього шляхом додавання коефіцієнта масштабування до формули, як це: dp * Gdx.graphics.getDensity() * distanceFactor. Ви можете зробити distanceFactor постійним і визначити його 2при компілюванні для консолі / телевізора, 1інакше. Звичайно, ви повинні знайти кращі значення для цього.
Густаво Масіель

У мене з цим проблеми. Коли я просто поміщаю розмір SP в генератор як розмір для пікселів, я отримую такий самий розмір на своєму робочому столі, як і зображення, та інші інтернет-джерела про це. Коли я помножую їх, getDensity() == 0.6вони не читаються на моєму робочому столі. Вони отримують невеликі розміри, але приємного розміру в моєму Galaxy S8, де `getDensity () == 3 '. Я сам підрахував щільність, і вони здаються правильними, тоді я насправді тримав телефон поруч із моїм настільним додатком, і вони справді рівні. Але чи не повинні вони бути розміром фактичного зображення, що переглядається на моєму робочому столі?
Мадменйо

@Madmenyo Про цей масштабний фактор я говорив. Ви повинні використовувати масштабування щільності, щоб зберегти розмір тексту однаковим на пристроях, що мають однаковий форм-фактор. Отже, замість просто dp * getDensity(), ви, мабуть, повинні зробити це dp * getDensity() * scalingFactor, що scalingFactorслід вирішити під час компіляції, і щось подібне могло б працювати: Телефони: scalingFactor = 1Комп'ютер: scalingFactor = 3і TV : scalingFactor = 5. Грайте з цими номерами!
Gustavo Maciel

GetDensity не повертає точну щільність, як виявилося. github.com/libgdx/libgdx/isissue/5322#issuecomment-406902114 вам потрібно зробити щось на кшталт, getPpiX() / 160)щоб отримати кращий результат. Тим getDensity()не менш, робить досить хорошу роботу, я думаю, в більшості випадків.
Мадменйо
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.