Преобразование пикселей в дп - PullRequest
755 голосов
/ 05 января 2011

Я создал свое приложение с указанными в пикселях высотой и шириной для устройства Pantech с разрешением 480x800.

Мне нужно преобразовать высоту и ширину для устройства G1.Я думал, что преобразование его в dp решит проблему и обеспечит одинаковое решение для обоих устройств.

Есть ли простой способ конвертировать пиксели в dp? Есть предложения?

Ответы [ 33 ]

974 голосов
/ 13 июня 2011
// Converts 14 dip into its equivalent px
float dip = 14f;
Resources r = getResources();
float px = TypedValue.applyDimension(
    TypedValue.COMPLEX_UNIT_DIP,
    dip,
    r.getDisplayMetrics()
);
808 голосов
/ 05 марта 2012
/**
 * 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){
    return dp * ((float) context.getResources().getDisplayMetrics().densityDpi / DisplayMetrics.DENSITY_DEFAULT);
}

/**
 * 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){
    return px / ((float) context.getResources().getDisplayMetrics().densityDpi / DisplayMetrics.DENSITY_DEFAULT);
}
274 голосов
/ 27 августа 2012

Предпочтительно помещать в класс 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;
}
187 голосов
/ 14 февраля 2012
float density = context.getResources().getDisplayMetrics().density;
float px = someDpValue * density;
float dp = somePxValue / density;

density равно

  • .75 на ldpi (120 точек на дюйм)
  • 1.0 на mdpi (160 точек на дюйм; базовая линия)
  • 1.5 на hdpi (240 точек на дюйм)
  • 2.0 на xhdpi (320 точек на дюйм)
  • 3.0xxhdpi (480 dpi)
  • 4.0 xxxhdpi (640 dpi)

Используйте этот онлайн-конвертер для игрывокруг со значениями dpi.

РЕДАКТИРОВАТЬ: Кажется, нет никакой связи 1: 1 между dpi ведро и density.Похоже, что Nexus 5X, будучи xxhdpi, имеет значение density 2.625 (вместо 3).Убедитесь сами в Device Metrics .

89 голосов
/ 16 октября 2013

Если вы можете использовать XML измерений, это очень просто!

В вашем res/values/dimens.xml:

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

Тогда в вашей Java:

getResources().getDimensionPixelSize(R.dimen.thumbnail_height);
75 голосов
/ 05 декабря 2011

Согласно руководству по разработке Android:

px = dp * (dpi / 160)

Но часто вам захочется сделать это наоборот, когда вы получите дизайн, который указан в пикселях. Итак:

dp = px / (dpi / 160)

Если вы используете устройство с разрешением 240 точек на дюйм, это соотношение равно 1,5 (как указано выше), поэтому это означает, что значок 60px в приложении равен 40dp.

74 голосов
/ 09 августа 2016

Вы можете использовать это .. без контекста

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

Как уже упоминалось @Stan .. использование этого подхода может вызвать проблемы, если плотность системы изменяется.Так что знайте об этом!

Лично я использую контекст, чтобы сделать это.

68 голосов
/ 26 июля 2013

Без Context, элегантные статические методы:

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);
}
41 голосов
/ 11 декабря 2015

Для DP to Pixel

Создать значение в dimens.xml

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

Получите это значение в pixel как:

int sizeInPixel = context.getResources().getDimensionPixelSize(R.dimen.textSize);
38 голосов
/ 28 марта 2012

Таким образом, вы можете использовать следующий составитель для вычисления правильного количества пикселей по измерению, указанному в dp

public int convertToPx(int dp) {
    // Get the screen's density scale
    final float scale = getResources().getDisplayMetrics().density;
    // Convert the dps to pixels, based on density scale
    return (int) (dp * scale + 0.5f);
}
...