web-dev-qa-db-fra.com

Comment convertir DP, PX, SP), en particulier DP et SP?

J'ai connu la différence entre DP , SP et PX . Et après avoir cherché ce sujet, je n'ai rien trouvé qui me satisfasse complètement. Peut-être que cet article est un doublon, mais je veux toujours savoir quelle est la formule de conversion de DP en PX , et DP à SP , de - SP à PX , à partir de PX à SP , à partir de SP à DP , de DP à SP ? J'ai connu certains codes pour le faire, mais ils sont imparfaits.

48
SilentKnight

DP à PX:

public static int dpToPx(float dp, Context context) {
    return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, context.getResources().getDisplayMetrics());
}

SP à PX:

public static int spToPx(float sp, Context context) {
    return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, sp, context.getResources().getDisplayMetrics());
}

DP à SP:

public static int dpToSp(float dp, Context context) {
    return (int) (dpToPx(dp, context) / context.getResources().getDisplayMetrics().scaledDensity);
}
124
AndroidEx

Il manque quelques réponses utiles à la réponse acceptée.

SP à PX

float sp = 20;
float px = sp * getResources().getDisplayMetrics().scaledDensity;

ou

float px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, sp, getResources().getDisplayMetrics());

PX à SP

float px = 70;
float sp = px / getResources().getDisplayMetrics().scaledDensity;

DP à PX

float dp = 20;
float px = dp * getResources().getDisplayMetrics().density;

ou

float px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, getResources().getDisplayMetrics());

PX à DP

float px = 70;
float dp = px / getResources().getDisplayMetrics().density;

Remarques

  • Les flotteurs que j'ai choisis ci-dessus (20 et 70) étaient des valeurs arbitraires. Vous pouvez brancher différents numéros si vous le souhaitez.
  • px fait référence aux pixels. Le nombre de pixels d’un périphérique par pouce d’écran est appelé densité.
  • dp signifie pixels indépendants de la densité. Autrement dit, quel que soit le périphérique utilisé, la taille réelle doit être la même. Par exemple, si je configure une vue sur 100 dp large, il aura la même largeur sur un nouveau téléphone haute densité que sur un vieux téléphone basse densité. (Si j'avais réglé la largeur sur 100 px, par contre, il semble grand sur un téléphone à faible densité et petit sur un téléphone à haute densité.) La densité est mesurée en points par pouce (DPI). La formule est px = dp * density. Il suffit donc de multiplier ou de diviser par la densité pour convertir entre px et dp.
  • sp signifie pixels indépendants de l'échelle. Il est uniquement utilisé pour les polices, pas les vues. Il est similaire à dp sauf qu'il tient également compte des préférences de l'utilisateur. Cette densité avec les préférences de l'utilisateur prises en compte est connue sous le nom de densité mise à l'échelle. Définition d'une police TextView sur une taille de 30 sp, par exemple, fera en sorte que le texte semble avoir la même taille physique sur tous les périphériques. Cependant, votre grand-mère peut avoir sa taille de police préférée maximale au maximum dans les paramètres de son téléphone, donc 30 sp Le texte aura l'air plus gros sur son téléphone que sur le vôtre. La formule est px = sp * scaledDensity.
  • Signification de DP et SP
  • DP en SP n'est généralement pas utile
48
Suragch

Pour convertir Dimension en Entier ou en Pixel, vous devez utiliser la fonction " getDimensionPixelSize (R.dimen.your_dp_value) ", comme. ..

Créer une valeur dans dimens.xml

<dimen name="padding_10">10dp</dimen>

Maintenant, pour cette valeur en pixel ou en entier, vous pouvez utiliser comme ci-dessous:

int sizeInPixel = context.getResources().getDimensionPixelSize(R.dimen.padding_10);
4
varotariya vajsi

Pour kotlin j'ai créé une fonction d'extension:

fun Number.spToPx(context: Context) = TypedValue.applyDimension(
    TypedValue.COMPLEX_UNIT_SP, this.toFloat(), context.resources.displayMetrics).toInt()

Vous pouvez l'utiliser comme 16.spToPx(context) ou 16.5.spToPx(context)

(Je place ces fonctions dans un fichier KotlinExtensions.kt )

2
vedant