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

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

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

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

Ответы [ 33 ]

34 голосов
/ 25 августа 2017

Для тех, кто использует Kotlin:

val Int.toPx: Int
    get() = (this * Resources.getSystem().displayMetrics.density).toInt()

val Int.toDp: Int
    get() = (this / Resources.getSystem().displayMetrics.density).toInt()

Использование:

64.toPx
32.toDp
33 голосов
/ 12 февраля 2014

В Android SDK есть утилита по умолчанию: http://developer.android.com/reference/android/util/TypedValue.html

float resultPix = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,1,getResources().getDisplayMetrics())
19 голосов
/ 02 мая 2018

Это должно дать вам преобразование дп в пиксели:

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

Это должно дать вам преобразование пикселей в dp:

public static int pxToDp(int px)
{
    return (int) (px / Resources.getSystem().getDisplayMetrics().density);
}
15 голосов
/ 21 сентября 2018

Котлин

fun convertDpToPixel(dp: Float, context: Context): Float {
    return dp * (context.resources.displayMetrics.densityDpi.toFloat() / DisplayMetrics.DENSITY_DEFAULT)
}

fun convertPixelsToDp(px: Float, context: Context): Float {
    return px / (context.resources.displayMetrics.densityDpi.toFloat() / DisplayMetrics.DENSITY_DEFAULT)
}

Java

public static float convertDpToPixel(float dp, Context context) {
    return dp * ((float) context.getResources().getDisplayMetrics().densityDpi / DisplayMetrics.DENSITY_DEFAULT);
}

public static float convertPixelsToDp(float px, Context context) {
    return px / ((float) context.getResources().getDisplayMetrics().densityDpi / DisplayMetrics.DENSITY_DEFAULT);
}
15 голосов
/ 03 марта 2019

использование kotlin-extension делает его лучше

fun Int.toPx(context: Context): Int = (this * context.resources.displayMetrics.density).toInt()

fun Int.toDp(context: Context): Int = (this / context.resources.displayMetrics.density).toInt()

ОБНОВЛЕНИЕ:

Поскольку displayMetrics является частью глобальных общих ресурсов мы можем использовать Resources.getSystem()

fun Int.toPx(): Int = (this * Resources.getSystem().displayMetrics.density).toInt()

fun Int.toDp(): Int = (this / Resources.getSystem().displayMetrics.density).toInt()
12 голосов
/ 31 октября 2014

Вероятно, лучший способ, если у вас есть измерение внутри значений / измерения, это получить измерение непосредственно из метода getDimension (), он вернет вам измерение, уже преобразованное в значение в пикселях.

context.getResources().getDimension(R.dimen.my_dimension)

ПростоЧтобы лучше объяснить это,

getDimension(int resourceId) 

вернет размер, уже преобразованный в пиксель, как ПЛАВУЩУЮ.

getDimensionPixelSize(int resourceId)

вернет то же самое, но усеченное до int, поэтому как ИНТЕГЕР.1010 *

См. Справочник по Android

9 голосов
/ 13 мая 2016
Чтобы преобразовать дп в пиксель.
public static int dp2px(Resources resource, int dp) {
    return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,   dp,resource.getDisplayMetrics());
}
Чтобы преобразовать пиксель в дп.
  public static float px2dp(Resources resource, float px)  {
    return (float) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, px,resource.getDisplayMetrics());
}

где ресурс - context.getResources ().

8 голосов
/ 14 февраля 2014

как это:

public class ScreenUtils {

    public static float dpToPx(Context context, float dp) {
        if (context == null) {
            return -1;
        }
        return dp * context.getResources().getDisplayMetrics().density;
    }

    public static float pxToDp(Context context, float px) {
        if (context == null) {
            return -1;
        }
        return px / context.getResources().getDisplayMetrics().density;
    }
}

зависит от контекста, возвращаемого значения с плавающей запятой, статического метода

от: https://github.com/Trinea/android-common/blob/master/src/cn/trinea/android/common/util/ScreenUtils.java#L15

7 голосов
/ 10 августа 2017

Более элегантный подход с использованием функции расширения kotlin

/**
 * Converts dp to pixel
 */
val Int.dpToPx: Int get() = (this * Resources.getSystem().displayMetrics.density).toInt()

/**
 * Converts pixel to dp
 */
val Int.pxToDp: Int get() = (this / Resources.getSystem().displayMetrics.density).toInt()

Использование:

println("16 dp in pixel: ${16.dpToPx}")
println("16 px in dp: ${16.pxToDp}")
7 голосов
/ 19 марта 2013

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

public final class DimensionUtils {

    private static boolean isInitialised = false;
    private static float pixelsPerOneDp;

    // Suppress default constructor for noninstantiability.
    private DimensionUtils() {
        throw new AssertionError();
    }

    private static void initialise(View view) {
        pixelsPerOneDp = view.getResources().getDisplayMetrics().densityDpi / 160f;
        isInitialised = true;
    }

    public static float pxToDp(View view, float px) {
        if (!isInitialised) {
            initialise(view);
        }

        return px / pixelsPerOneDp;
    }

    public static float dpToPx(View view, float dp) {
        if (!isInitialised) {
            initialise(view);
        }

        return dp * pixelsPerOneDp;
    }
}
...