web-dev-qa-db-fra.com

Android: taille du texte Canvas.drawText () sur différentes résolutions d'écran

Pour mon jeu Android Android, j'ai quelques appels à Canvas.drawText().

Pour les tests, j'utilise la taille de police standard qui semble bien fonctionner.

Cependant, lorsque j'augmente la résolution à une densité plus élevée, les images plus grandes sont automatiquement chargées, mais le texte est désormais incroyablement petit.

Existe-t-il un moyen simple de calculer la taille du texte à dessiner ou dois-je le faire manuellement?

edit: Quel était l'intérêt de éditer mon article @Suragch?

34
twig

Le moyen le plus simple consiste à définir les tailles de police dans vos ressources avec les unités de pixels indépendants de l'échelle (sp) - cette unité est similaire aux pixels indépendants de la densité (dp ou dip) en ce qu'il prend en compte la densité de l'écran mais il prend également en compte le paramètre de taille de police de l'utilisateur.

Pour ajouter une nouvelle dimension, créez un dimens.xml fichier dans votre res/values dossier et entrez le code suivant pour ajouter une nouvelle dimension avec le nom myFontSize:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="myFontSize">20sp</dimen>
</resources>

Vous pouvez ensuite obtenir la taille du texte dans votre application en utilisant

int scaledSize = getResources().getDimensionPixelSize(R.dimen.myFontSize);

La taille résultante sera correctement mise à l'échelle pour prendre en compte la densité d'écran actuelle et le paramètre de taille de police.

Pour plus d'informations, consultez la page Développeurs Android sur Plus de ressources .

80
Joseph Earl

Le moyen le plus simple consiste à définir la taille de votre police dans votre répertoire de ressources avec les unités de scale-independent pixel (sp) ou density-independent pixel (dp). Obtenez ensuite la taille du texte en utilisant

int scaledSize = getResources().getDimensionPixelSize(R.dimen.font_size);
mTextView.setTextSize(scaledSize);

Cela mettra la taille du texte à l'échelle en fonction de la densité/résolution d'écran actuelle et du paramètre de taille de police de l'utilisateur.

Comment définir la taille de la police dans le répertoire des ressources?

Créez un fichier nommé dimens.xml dans le dossier res->values. Copiez ensuite le code suivant.

<resources>
    <dimen name="font_size">25sp</dimen>   // sp or dp accordingly
</resources>

L'attribut name de la balise <dimen> sera utilisé comme ID de ressource.

4
Trung

Vous pouvez le faire vous-même en utilisant une simple opération mathématique:

Vous devez calculer une relation qui dessine votre texte de la même taille pour n'importe quelle taille de toile, utilisez donc la taille réelle du toile, comme ceci:

double relation = Math.sqrt(canvas.getWidth() * canvas.getHeight());

Mais ce nombre est tout simplement trop grand, alors divisez-le par celui qui convient à vos besoins, disons 250:

relation = relation / 250;

Vous pouvez maintenant définir la taille de votre texte comme ceci:

Paint.setTextSize((float) (myFontSize * relation));

Vous n'avez pas besoin de diviser la relation par n'importe quel nombre mais dans ce cas, vous devrez utiliser de très petites tailles de police pour la variable myFontSize. Pour moi, 250 fonctionne très bien pour utiliser des tailles de police régulières qui s'adapteront à n'importe quelle taille d'écran, car vous prenez déjà en compte la dimension en pixels de votre toile.

4
Camilo Ortegón

Lors de l'appel Canvas.drawText() la taille du texte est d'abord déterminée par l'objet passé dans Paint, qui peut être défini via Paint.setTextSize() . La taille du texte est automatiquement mise à l'échelle par Canvas en fonction de la densité du canevas, qui peut être trouvée à l'aide de Canvas.getDensity() .

Lorsque vous définissez la taille du texte sur un objet Paint qui sera dessiné sur Canvas, travaillez avec une valeur unitaire de dp ou sp et laissez Canvas gérer la mise à l'échelle pour vous.

1
Tanner Perrien