2014-11-07 12 views
8

In uno Scrabble word game app Sto provando a disegnare lettere e valori neri su riquadri gialli.Definizione delle dimensioni del testo per Canvas.drawText() in res/values ​​/ dimens.xml

Anche se questo funziona a emulatori Android sotto Windows e Mac:

Mac screenshot

Windows screenshot

questo non funziona (la dimensione del testo è troppo grande) su dispositivi reali come Moto G, Nexus 1 e 4:

Real devices

definisco le dimensioni del testo di 60SP e 20SP (ho provato dp troppo) in res/values/dimens.xml:

<resources> 
    <dimen name="big_tile_letter">60sp</dimen> 
    <dimen name="big_tile_value">20sp</dimen> 
</resources> 

e poi li uso nel mio BigTile.java classe:

int letterSize = context.getResources().getDimensionPixelSize(R.dimen.big_tile_letter); 
    mLetterPaint = new Paint(); 
    mLetterPaint.setTextSize(letterSize); 
    mLetterPaint.setAntiAlias(true); 

    Rect letterBounds = new Rect(); 
    mLetterPaint.getTextBounds(letter, 0, letter.length(), letterBounds); 
    mLetterX = 0.45f * (width - letterBounds.width()); 
    mLetterY = 0.45f * (height + letterBounds.height()); 

    canvas.drawText(letter, mLetterX, mLetterY, mLetterPaint); 

Che cosa sto facendo di sbagliato?

+1

Utilizza la stessa unità di misura ('sp',' dp', qualunque sia) per entrambe le lettere e la casella in cui lo stai disegnando. – laalto

+0

+1 ma il problema è: le tessere sono [immagini png] (https://github.com/afarber/android-newbie/blob/q4/TestScroll2/res/drawable-mdpi/big_tile.png) e la lettera e valore sono stringhe disegnate con il metodo 'canvas.drawText()'. –

+0

Ridimensionare il PNG in modo proporzionale alle dimensioni del testo o impostare le dimensioni del testo come proporzione della dimensione PNG. – laalto

risposta

5

Se quello che vuoi è quello di convertire un valore dalla R.dimen.something in pixel in modo da:

float textSize = getResources().getDimensionPixelSize(R.dimen.something); 

Se quello che vuoi è quello di fornire un valore manuale o qualcosa del genere:

float maxTextSize = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, maxTextSize, getResources().getDisplayMetrics()); 
+0

Ma sono abbastanza logico usando 'getResources(). GetDimensionPixelSize (R.dimen.something)' nel mio codice (vedere sopra). Non capisco come la tua risposta aiuti –

+0

Sei sicuro di aver coperto tutti i valori per tutti i DPI dello schermo? – TacB0sS

2

Una cosa che viene in mente è che si utilizzano i valori sp, che dipendono dalle impostazioni utente in Impostazioni/Display/Dimensione carattere. Puoi verificare se l'impostazione è come Large o così - questo applicherebbe un ridimensionamento aggiuntivo sulla dimensione del tuo carattere. Inoltre, credo che per i dispositivi 2.x l'impostazione predefinita sia diversa rispetto ai dispositivi 4.x (non sono sicuro però).

Si potrebbe provare utilizzare i valori dp e vedere se questo fa alcuna differenza.

+0

Scusa, ho appena visto che l'hai già provato. Si prega di ignorare questa risposta. – Flo

+0

Sì, ho provato anche quello. Ancora +1 e grazie per aver risposto –

2

Il problema è che setTextSize ottiene il valore della dimensione in SP, non in pixel. Nel tuo caso, getDimensionPixelSize converte sp in pixel, quindi setTextSize considera i pixel come sp e ridimensiona nuovamente.

pubblico setTextSize vuoto (dimensione float)

Impostare la dimensione testo predefinito al valore dato, interpretato come "scalata pixel" unità. Questa dimensione viene regolata in base alla densità di corrente e alla preferenza per la dimensione del carattere utente di .

Per risolvere questo problema, è possibile chiamare

setTextSize (TypedValue.COMPLEX_UNIT_PX, letterSize) 
+1

Ma non c'è 'Paint.setTextSize()' che prende 2 argomenti? –

+0

La documentazione che stai citando è per TextView, non Paint/TextPaint. Paint.setSize() utilizza pixel. – Karsten

1

Utilizzando dp per le dimensioni del testo è sicuramente il modo di andare qui, a meno che non si voleva per compensare manualmente per l'impostazione dimensione del carattere dell'utente scalando le immagini anche.

Il tuo problema è che l'immagine big_tile ha dimensioni incoerenti nel MDPI (128x128) e xxhdpi (256x256) Varianti: xxhdpi dovrebbe essere 3 volte la risoluzione di MDPI, ma l'immagine è solo 2x le dimensioni, il che rende efficace ~ 85 dpi invece di 128 dpi.

Sono sicuro di aver visto Android Lint avvisare di questo genere di cose, provare a eseguirlo sul progetto.

Problemi correlati