web-dev-qa-db-fra.com

Comment définir l'unité pour Paint.setTextSize ()

Est-il possible de changer l'unité pour Paint.setTextSize()? Pour autant que je sache, c'est le pixel, mais j'aime définir la taille du texte dans DIP pour la prise en charge de plusieurs écrans.

56
Yverman

Convertissez-le comme ceci

// The gesture threshold expressed in dip
private static final float GESTURE_THRESHOLD_DIP = 16.0f;

// Convert the dips to pixels
final float scale = getContext().getResources().getDisplayMetrics().density;
mGestureThreshold = (int) (GESTURE_THRESHOLD_DIP * scale + 0.5f);

// Use mGestureThreshold as a distance in pixels

d'ici http://developer.Android.com/guide/practices/screens_support.html#dips-pels

46
Alex Volovoy

Je sais que ce sujet est ancien et a déjà été répondu, mais je voudrais également suggérer ce morceau de code:

int MY_DIP_VALUE = 5; //5dp

int pixel= (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
                              MY_DIP_VALUE, getResources().getDisplayMetrics());
90
Felipe Caldas

La réponse acceptée concerne les gestes, pas la définition de la taille du texte. La réponse votée la plus élevée (au moment d'écrire ces lignes) est proche, mais la documentation recommande d'utiliser sp plutôt que dp car en plus d'être mise à l'échelle pour les densités d'écran (comme dp les valeurs sont), sp est également mis à l'échelle en fonction des tailles de police préférées par l'utilisateur.

À partir d'un int dans le code

int spSize = 17;
float scaledSizeInPixels = spSize * getResources().getDisplayMetrics().scaledDensity;
mTextPaint.setTextSize(scaledSizeInPixels);

Ou bien

int spSize = 17;
float scaledSizeInPixels = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,
        spSize, getResources().getDisplayMetrics());
mTextPaint.setTextSize(scaledSizeInPixels);

À partir des ressources

Ou si vous avez la valeur sp ou dp dans les ressources:

<resources>
    <dimen name="fontSize">17sp</dimen>
</resources>

avec

float scaledSizeInPixels = getResources().getDimensionPixelSize(R.dimen.fontSize);
mTextPaint.setTextSize(scaledSizeInPixels);

Autres liens

24
Suragch

Et voici une méthode encore plus courte pour convertir les dp-s en px-els en tenant compte des métriques d'affichage

https://developer.Android.com/reference/Android/content/res/Resources.html#getDimensionPixelSize (int)

3
pelotasplus

Si votre objet Paint est utilisé pour dessiner du texte sur un canevas, vous pouvez laisser le canevas gérer la mise à l'échelle pour vous.

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 en utilisant 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.

2
Tanner Perrien