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

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

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

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

Ответы [ 33 ]

6 голосов
/ 02 июля 2013

Вот как это работает для меня:

DisplayMetrics displaymetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
int  h = displaymetrics.heightPixels;
float  d = displaymetrics.density;
int heightInPixels=(int) (h/d);

Вы можете сделать то же самое для ширины.

6 голосов
/ 03 февраля 2014

для преобразования пикселей в dp используйте TypedValue .

Как упоминалось в документации: Контейнер для динамически типизированного значения данных.

и используйте метод applyDimension :

public static float applyDimension (int unit, float value, DisplayMetrics metrics) 

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

Resources resource = getResources();
float dp = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, 69, resource.getDisplayMetrics());

Надеюсь, что поможет.

6 голосов
/ 22 апреля 2015
float scaleValue = getContext().getResources().getDisplayMetrics().density;
int pixels = (int) (dps * scaleValue + 0.5f);
5 голосов
/ 05 января 2011

Вы должны использовать dp так же, как и пиксели. Это все, что они есть; отображать независимые пиксели. Используйте те же цифры, что и на экране средней плотности, и размер будет магически правильным на экране высокой плотности.

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

5 голосов
/ 21 июля 2016

Много замечательных решений выше. Тем не менее, лучшее решение, которое я нашел, это дизайн Google:

https://design.google.com/devices/

Density

4 голосов
/ 25 августа 2011

PX и DP различны, но похожи.

DP - это разрешение, когда учитывается только физический размер экрана.Когда вы используете DP, он будет масштабировать ваш макет на другие экраны аналогичного размера с разной плотностью pixel.

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

То есть на устройстве Android обычный экран hdpi, 800x480 is 533x320 в DP (я полагаю).Чтобы преобразовать DP в pixels /1.5, чтобы преобразовать обратно *1.5.Это только для одного размера экрана и dpi, он будет меняться в зависимости от дизайна.Наши художники дают мне pixels, и я конвертирую в DP с помощью приведенного выше уравнения 1.5.

2 голосов
/ 24 апреля 2018

Если вам нужны значения Integer , то использование Math.round () округляет число с плавающей точкой до ближайшего целого числа.

public static int pxFromDp(final float dp) {
        return Math.round(dp * Resources.getSystem().getDisplayMetrics().density);
    }
2 голосов
/ 07 августа 2016

Это работает для меня (C #):

int pixels = (int)((dp) * Resources.System.DisplayMetrics.Density + 0.5f);
1 голос
/ 04 октября 2018

Котлин

   fun spToPx(ctx: Context, sp: Float): Float {
    return sp * ctx.resources.displayMetrics.scaledDensity
}

fun pxToDp(context: Context, px: Float): Float {
    return px / context.resources.displayMetrics.density
}

fun dpToPx(context: Context, dp: Float): Float {
    return dp * context.resources.displayMetrics.density
}

Java

   public static float spToPx(Context ctx,float sp){
    return sp * ctx.getResources().getDisplayMetrics().scaledDensity;
}

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

public static float dpToPx(final Context context, final float dp) {
    return dp * context.getResources().getDisplayMetrics().density;
}
0 голосов
/ 01 февраля 2019

Для кода React Native Java уже существует класс util:

import com.facebook.react.uimanager.PixelUtil;

float dp = PixelUtil.toDIPFromPixel(somePixelValue);
...