Come abbinare la dimensione del carattere alla risoluzione dello schermo?


12

Quindi sto lavorando a un gioco usando LibGDX e ho un problema.

Per adattare il mio gioco alla maggior parte delle risoluzioni, ho creato un asset di base per ogni formato, ad esempio un'immagine di sfondo del menu principale, l'ho creato in 800X600 per 4: 3, 1280X720 per 16: 9 ecc.

Ora sto cercando di incorporare TextButtons nel gioco, per le opzioni; Il mio problema è che non riesco a capire quali dimensioni dei caratteri corrispondono a quali risoluzioni dello schermo. C'è un modo per capirlo, o devo passare uno alla volta attraverso ciascuna delle risoluzioni che ho e semplicemente abbinare manualmente il testo alla risoluzione?

Risposte:


17

È facile: i caratteri non devono necessariamente corrispondere alla risoluzione, ma devono corrispondere alla densità dei pixel .

La densità dei pixel viene misurata come pixel per pollice ( PPI ) o pixel per centimetro. C'è anche un'unità di misura chiamata pixel indipendenti dalla densità ( DP ) . È definito 1dpla dimensione di un pixel su uno 160 PPIschermo.

Ora tornando ai caratteri, prova a fare questo test: metti il ​​tuo laptop su 720p. Dai un'occhiata alla dimensione del carattere. Ora collegalo al monitor 1080p da 42 "del desktop. Se il monitor emette le giuste informazioni sulla sua dimensione, il font dovrebbe avere ESATTAMENTE le stesse dimensioni che aveva sullo schermo a 720p. Immagina quanto sarebbe strano se il testo nel tuo il laptop aveva dimensioni diverse rispetto al testo sul monitor del desktop. Detto questo, risoluzioni più grandi dovrebbero fornire maggiori dettagli al carattere, schermi più grandi dovrebbero dare più contenuti da mostrare.

Lo stesso fatto può essere osservato sugli editor di testo. Un 72ptcarattere dovrebbe apparire sullo schermo come se fosse stampato su carta.

Tutto ciò significa che probabilmente dovresti desiderare la stessa dimensione in tutte le dimensioni del display (con alcune eccezioni). Se vuoi basarti da qualche parte, i siti Web di solito usano 12ptcaratteri, usi 11pte 12ptcaratteri di MS Windows .

Questo grafico (incluso anche nella parte inferiore della risposta) che ci dice 12ptin CSS è approssimativamente uguale a 16pxanche in CSS (Come se ciò non fosse abbastanza confuso, un px in CSS è uguale a dp ovunque), quindi diciamo che 16dpcreerò i tuoi caratteri su LibGDX.

Nel tuo gioco, usa il FreeTypeFontGeneratorper generare i caratteri in modo dinamico, in questo modo puoi considerare la densità dello schermo quando li crei:

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

Questo funziona perché Gdx.graphics.getDensity()è uguale a YourScreenDensity/160così, è un "fattore di scala" per portare le cose alle dimensioni che sarebbero su uno schermo di 160ppi.

A proposito delle eccezioni che ho menzionato prima: probabilmente vorrai ridimensionare i caratteri in base alle dimensioni dello schermo in caso di loghi, promozioni, ecc. Ma tieni presente che farai meglio a realizzarli su un editor grafico come Photoshop o Gimp , Comunque.

L'altra eccezione è il testo su piccoli schermi. Schermi telefonici da 4,5 "o più piccoli, indossabili. Di solito non avrai il tempo di creare contenuti scorrevoli o semplicemente non potrai permetterti di mettere così tanto contenuto su quello schermo. Puoi provare a ridimensionare il carattere 1dp, come il il lettore probabilmente avrà il telefono molto vicino al viso, probabilmente non avrà problemi a leggere. Tieni presente che potresti infastidire il lettore che legge un piccolo testo illeggibile.

TL; DR:

  • Le dimensioni fisiche non cambieranno direttamente con le dimensioni dello schermo o la risoluzione, ma con una combinazione di entrambi ( screenSize/resolutionil famoso PPI)
  • Pensa a pt e dp . Dimentica i pixel dello schermo fino a quando non devi disegnare il risultato finale.
  • Crea il tuo carattere in fase di esecuzione con una dimensione ragionevole.
  • Conversione di dp in pixel dello schermo:pixels = dp * Gdx.graphics.getDensity();
  • Se stai usando un motore che non ti dà un convertitore in dp come quello di LibGDX Gdx.graphics.getDensity(), puoi provare :, densityFactor = Screen.getPixelsPerInch() / 160.0fallorapixels = dp * densityFactor

MODIFICARE:

2014, 25 giugno su Google IO, Matias ha annunciato nuove linee guida di stile per Android, che include un nuovo carattere Roboto e linee guida per la tipografia. Prendi questa tabella come guida:

Linee guida per le dimensioni dei caratteri di Android, prese da google.com/design

EDIT2:

Tabella delle dimensioni dei caratteri CSS inclusa nel caso in cui il collegamento diventi marcio: Dimensioni dei caratteri CSS


1
+1, ottima risposta. Anche la distanza di visione è un fattore molto importante. Avrai bisogno di caratteri più grandi per i giochi che girano su una console / TV rispetto a quelli per PC o persino un Tablet (dove la distanza di visualizzazione è piuttosto breve).
bummzack,

1
@bummzack fantastico che tu l'abbia sottolineato! È possibile raggiungere questo obiettivo con l'aggiunta di un fattore di scala per la formula, in questo modo: dp * Gdx.graphics.getDensity() * distanceFactor. In alternativa, è possibile rendere distanceFactor una costante e definirla 2durante la compilazione per console / TV 1. Ovviamente dovresti trovare valori migliori per questo.
Gustavo Maciel,

Sto avendo problemi con questo. Quando ho appena inserito la dimensione SP nel generatore come dimensione per i pixel, ottengo le stesse dimensioni esatte sulla mia app desktop come quelle nell'immagine e altre fonti online su questo. Quando mi moltiplico per getDensity() == 0.6sono illeggibili sul mio desktop. Ottengono piccoli, ma ben dimensionati sul mio Galaxy S8 dove `getDensity () == 3 '. Ho calcolato io stesso la densità e sembrano corretti, quindi in realtà ho tenuto il mio telefono vicino all'applicazione desktop e sono effettivamente uguali. Ma non dovrebbero avere le dimensioni dell'immagine reale visualizzata sul mio desktop?
Madmenyo,

@Madmenyo Questo è il fattore di ridimensionamento di cui ho parlato. È necessario utilizzare il ridimensionamento della densità per mantenere le stesse dimensioni del testo sui dispositivi con lo stesso fattore di forma. Così, invece di appena dp * getDensity(), probabilmente si dovrebbe fare dp * getDensity() * scalingFactor, che scalingFactordovrebbe essere decisa in fase di compilazione, e qualcosa di simile potrebbe funzionare: Cellulari: scalingFactor = 1Computer: scalingFactor = 3e TV: scalingFactor = 5. Gioca con questi numeri!
Gustavo Maciel,

GetDensity non restituisce la densità esatta come risulta. github.com/libgdx/libgdx/issues/5322#issuecomment-406902114 devi fare qualcosa di simile getPpiX() / 160)per ottenere un risultato migliore. Tuttavia, getDensity()nella maggior parte dei casi , fa un lavoro abbastanza buono.
Madmenyo,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.