Android Convert Px to Dp (Video Aspect Ratio) [duplicate]
Asked Answered
P

1

29

Possible Duplicate:
converting pixels to dp in android

I'm trying to convert pixels to dp. What is the formula?

Lets convert 640 and 480 into dp. The docs say this

The conversion of dp units to screen pixels is simple: px = dp * (dpi / 160)

But I don't think that is what I need (and I don't know how to use this). I guess I just need the forumla. I have the code ready:

DisplayMetrics metrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(metrics);

    switch(metrics.densityDpi)
    {
         case DisplayMetrics.DENSITY_LOW:
         int sixForty = ?
         int fourEighty = ?
         break;

         case DisplayMetrics.DENSITY_MEDIUM:
         int sixForty = ?
         int fourEighty = ?
         break;

         case DisplayMetrics.DENSITY_HIGH:
         int sixForty = ?
         int fourEighty = ?
         break;
    }
Placate answered 11/7, 2011 at 21:3 Comment(1)
If you're looking to do a one-off conversion (for instance for exporting sprites from Photoshop), here's a nifty converter.Logia
N
84

Instead of trying to infer the dp conversion factor from the screen's density classification, you can simply query it directly:

getWindowManager().getDefaultDisplay().getMetrics(metrics);
float logicalDensity = metrics.density;

logicalDensity will then contain the factor you need to multiply dp by to get physical pixel dimensions for the device screen.

int px = (int) Math.ceil(dp * logicalDensity);
Neap answered 11/7, 2011 at 21:24 Comment(9)
i need the dp value of PIXELS. I have a video that is 640pixels by 480pixels and I need to get their dp equivalents based upon what density the screen is (I know how to get pixels from dp, but not vice versa)Placate
To get dp from pixels, divide the density into the pixel value rather than multiply.Neap
public int convertToDp(int input) { // Get the screen's density scale final float scale = getResources().getDisplayMetrics().density; // Convert the dps to pixels, based on density scale return (int) (input * scale + 0.5f); }Archeozoic
Old question, but why + 0.5 ?Jillayne
The +0.5 rounds up to the nearest whole number if necessary. When converted to integer, everything after the decimal is simply cut off. The +0.5 ensures that the most "correct" integer is returned.Neap
I would use int px = (int) Math.ceil(dp * logicalDensity); then. At least for educational purposes :-)Balefire
Its really odd the ceil function returns a double.Balkhash
I finally made the edit to use a proper Math function instead of + 0.5...Moraceous
I have created online calculator( converter ) you can check it out servoper.net/android-design-calculatorEllingston

© 2022 - 2024 — McMap. All rights reserved.