8
votes

Définition de la taille du texte pour canvas.Drawtext () dans res / valeurs / dimens.xml

dans un Scrabble - comme application de jeu de mots J'essaie de Dessinez des lettres noires et des valeurs sur des carreaux jaunes.

Bien que cela fonctionne chez Android Emulators sous Windows et Mac: P>

 capture d'écran Mac p>

 écran d'écran Windows p>

P> Cela ne fonctionne pas (la taille du texte est trop grosse) sur des appareils réels tels que Moto G, Nexus 1 et 4: P>

 réel appareils p>

Je définis les tailles de texte de 60SP strong> et 20SP fort> (j'ai essayé DP aussi) dans res / valeurs / dimens.xml : p> xxx pré>

puis utilisez-les dans mon BIGTILE.JAVA CLASSE: P>

    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);


4 commentaires

Utilisez la même unité de dimension ( sp , dp , quoi que ce soit) pour les lettres et la boîte où vous le dessinez.


+1 Mais le problème est le suivant: les tuiles sont Images PNG et la lettre et la valeur sont des chaînes dessinées avec canvas.drawtext () méthode.


Soit échelle la PNG à être proportionnelle à votre taille de texte ou définissez votre taille de texte comme une proportion de la taille PNG.


Êtes-vous sûr d'avoir une échelle de toile correcte lorsque vous dessinez les lettres?


4 Réponses :


5
votes

Si ce que vous voulez convertir une valeur de la r.dimen.quelque chose en pixels donc: xxx

Si ce que vous voulez, c'est de fournir un valeur manuelle ou quelque chose comme ça: xxx


2 commentaires

Mais j'en ai alourdis, gettresources (). Getdimensionpixelsize (r.dimen.something) dans mon code (voir ci-dessus). Je ne comprends pas comment votre réponse aide


Êtes-vous sûr que vous avez couvert toutes les valeurs de tous les DPI d'écran?



2
votes

Une chose qui me vient à l'esprit est que vous utilisez des valeurs sp , qui dépendent du paramètre utilisateur dans les paramètres / affichage / la taille de la police. Pouvez-vous vérifier si le paramètre est comme grand ou de même - cela appliquerait une échelle supplémentaire sur votre taille de police. En outre, je crois que les périphériques 2.x Le paramètre par défaut est différent de celui des périphériques 4.x (pas sûr de).

Vous pouvez essayer d'utiliser des valeurs dp et voir si cela fait toute différence.


1 commentaires

Désolé, je viens de voir que tu as déjà essayé ça. S'il vous plaît ignorer cette réponse.



2
votes

Le problème est que Settextsize obtient la valeur de la taille dans SP, pas en pixels. Dans votre cas, GetDimensionPixelsize convertit SP en pixels, puis SettexTexise traite les pixels comme SP, et s'échappe à nouveau.

vide public de stactextisize (taille de flotteur) p>

Définir la taille de texte par défaut sur la valeur donnée, interprétée comme "mise à l'échelle des unités de pixel. Cette taille est ajustée en fonction de la densité de courant et Taille de la police de l'utilisateur Préférence. P> blockQuote>

Pour résoudre ce problème, vous pouvez appeler p>

setTextSize (TypedValue.COMPLEX_UNIT_PX, letterSize)


2 commentaires

Mais il n'y a pas de peinture.settextsize () prendre 2 arguments?


La documentation que vous citer est pour TextView, ne pas peindre / textpaint. Paint.SetSize () utilise des pixels.



1
votes

Utiliser DP pour que la taille du texte est définitivement la voie à suivre ici, à moins que vous ne souhaitiez pas compenser manuellement le paramètre de la taille de la police de l'utilisateur en modifiant également vos images.

Votre problème est que votre image BIG_TILE est de tailles incohérentes dans les variantes MDPI (128x128) et XXHDPI (256x256): XXHDPI doit être 3 fois la résolution de MDPI, mais votre image n'est que 2 fois la taille, ce qui le rend efficace ~ 85DP au lieu de 128DP.

Je suis à peu près sûr que j'ai vu Android Lintn Avertissez ce genre de choses, essayez de le courir sur votre projet.


0 commentaires