Question Conversion de pixels en dp


J'ai créé mon application avec la hauteur et la largeur données en pixels pour un appareil Pantech dont la résolution est 480x800.

J'ai besoin de convertir la hauteur et la largeur pour un appareil G1. Je pensais que la conversion en dp résoudrait le problème et fournirait la même solution pour les deux appareils.

Y at-il un moyen facile de convertir les pixels en dp? Aucune suggestion?


666
2018-01-05 15:04


origine


Réponses:


/// Converts 14 dip into its equivalent px

Resources r = getResources();
float px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 14, r.getDisplayMetrics());

897
2018-06-13 05:56



/**
 * This method converts dp unit to equivalent pixels, depending on device density. 
 * 
 * @param dp A value in dp (density independent pixels) unit. Which we need to convert into pixels
 * @param context Context to get resources and device specific display metrics
 * @return A float value to represent px equivalent to dp depending on device density
 */
public static float convertDpToPixel(float dp, Context context){
    Resources resources = context.getResources();
    DisplayMetrics metrics = resources.getDisplayMetrics();
    float px = dp * ((float)metrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT);
    return px;
}

/**
 * This method converts device specific pixels to density independent pixels.
 * 
 * @param px A value in px (pixels) unit. Which we need to convert into db
 * @param context Context to get resources and device specific display metrics
 * @return A float value to represent dp equivalent to px value
 */
public static float convertPixelsToDp(float px, Context context){
    Resources resources = context.getResources();
    DisplayMetrics metrics = resources.getDisplayMetrics();
    float dp = px / ((float)metrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT);
    return dp;
}

723
2018-03-05 08:09



De préférence mis dans une classe Util.java

public static float dpFromPx(final Context context, final float px) {
    return px / context.getResources().getDisplayMetrics().density;
}

public static float pxFromDp(final Context context, final float dp) {
    return dp * context.getResources().getDisplayMetrics().density;
}

261
2017-08-27 18:34



float density = context.getResources().getDisplayMetrics().density;
float px = someDpValue * density;
float dp = somePxValue / density;

density équivaut à

  • .75 sur ldpi (120 dpi)
  • 1.0 sur mdpi (160 dpi; référence)
  • 1.5 sur hdpi (240 dpi)
  • 2.0 sur xhdpi (320 dpi)
  • 3.0 sur xxhdpi (480 dpi)
  • 4.0 sur xxxhdpi (640 dpi)

Utilisez ceci convertisseur en ligne pour jouer avec les valeurs dpi.

MODIFIER: Il semble qu'il n'y ait pas de relation 1: 1 entre dpi seau et density. Il ressemble à la Nexus 5X étant xxhdpi a un density valeur de 2.625 (au lieu de 3). Voyez par vous-même dans le Métriques de périphérique.


171
2018-02-14 09:56



Selon le Guide de développement Android:

px = dp * (dpi / 160)

Mais souvent, vous aurez envie de faire cela dans l'autre sens lorsque vous recevez un design qui est indiqué en pixels. Alors:

dp = px / (dpi / 160)

Si vous êtes sur un appareil à 240dpi, ce rapport est de 1,5 (comme indiqué précédemment), ce qui signifie qu'une icône de 60px équivaut à 40dp dans l'application.


81
2017-12-05 19:00



Si vous pouvez utiliser les dimensions XML, c'est très simple!

Dans ton res/values/dimens.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="thumbnail_height">120dp</dimen>
    ...
    ...
</resources>

Puis dans votre Java:

getResources().getDimensionPixelSize(R.dimen.thumbnail_height);

76
2017-10-16 01:39



Sans pour autant Context, méthodes statiques élégantes:

public static int dpToPx(int dp)
{
    return (int) (dp * Resources.getSystem().getDisplayMetrics().density);
}

public static int pxToDp(int px)
{
    return (int) (px / Resources.getSystem().getDisplayMetrics().density);
}

62
2017-07-26 11:20



Vous pouvez l'utiliser .. sans contexte

public static int pxToDp(int px) {
    return (int) (px / Resources.getSystem().getDisplayMetrics().density);
}

public static int dpToPx(int dp) {
    return (int) (dp * Resources.getSystem().getDisplayMetrics().density);
}

59
2017-08-09 03:42



Pour DP to Pixel

Créer une valeur dans dimens.xml

<dimen name="textSize">20dp</dimen>

Obtenez cette valeur en pixel comme:

int sizeInPixel = context.getResources().getDimensionPixelSize(R.dimen.textSize);

38
2017-12-11 10:22